我有数据的文件,我可以作为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)))]

由于您的示例使用NULLis.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")
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top