我有一个CSV数据文件,我可以使用R加载 read.csv()
有些数据丢失了,所以我想将数据帧缩小到完全由非缺失数据组成的设置,即如果NULL
出现在任何地方,我想从过滤后的数据集中排除该列和行.
我知道我可以通过内置的R向量操作相当简单地做到这一点,但我不太确定如何做到这一点?
为了使我的问题更具体一点,这里有一个快速的数据样本,以便您可以看到我想要做的事情.
DocID Anno1 Anno7 Anno8 1 7 NULL 8 2 8 NULL 3 44 10 2 3 45 6 6 6 46 1 3 4 49 3 8 5 62 4 NULL 9 63 2 NULL 4 67 11 NULL 3 91 NULL 9 7 92 NULL 7 5 93 NULL 8 8
所以考虑到这个输入,我需要一些代码来减少输出.
DocID Anno8 44 3 45 6 46 4 49 5
作为Anno8
唯一具有非NULL数据的列,并且只有四行具有非NULL数据.
您可以使用na.omit()删除包含缺失的任何行,但这不是您想要的.而且,目前接受的答案是错误的.它为您提供了完整的列,但不会删除具有一个或多个缺失值的行,这就是所要求的.正确答案可以获得:
> a <- data.frame(a=c(1,2),b=c(NA,1), c=c(3,4)) > a a b c 1 1 NA 3 2 2 1 4 > na.omit(a)[,colSums(is.na(a))==0] a c 2 2 4
要看到上面的答案是错误的:
> a[ ,apply(a, 2, function(z) !any(is.na(z)))] a c 1 1 3 2 2 4
由于第2列中的NA,应删除第1行.
如果x
是你的data.frame
(或matrix
)那么
x[ ,apply(x, 2, function(z) !any(is.na(z)))]
由于您的示例使用NULL
,is.na(·)
将被替换为is.null(·)
或者你可以看看subset(·)
.