题
我有数据的文件,我可以作为R使用read.csv()
加载的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数据。
解决方案
如果x
是您的data.frame
(或matrix
)然后
x[ ,apply(x, 2, function(z) !any(is.na(z)))]
由于您的示例使用NULL
,is.na(·)
将由is.null(·)
替换
或者,也可以看subset(·)
。
其他提示
您可以删除包含缺失的using 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
第1行应该因为NA第2栏被丢弃。
a <- data.frame(a=c(1,2,0,1),b=c(NA,1,NA,1), c=c(3,4,5,1))
na.omit(a)
a b c
2 2 1 4
4 1 1 1
a[rowSums(is.na(a))==0,]
a b c
2 2 1 4
4 1 1 1
a[complete.cases(a),]
a b c
2 2 1 4
4 1 1 1
此外,您还可以使用sqldf
库做到这一点,如果x
是您的数据框:
library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")
不隶属于 StackOverflow