13

我有一个 CSV 的数据文件,我可以使用它在 R 中加载read.csv()

一些数据丢失了,所以我想将数据框减少到完全由非缺失数据组成的集合,即如果 aNULL出现在任何地方,我想从过滤的数据集中排除该列和行。

我知道我可以通过内置的 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

AsAnno8是唯一具有非 NULL 数据的列,并且只有四行具有非 NULL 数据。

4

4 回答 4

20

您可以使用 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 行。

于 2009-01-25T00:05:19.107 回答
8

如果x是你的data.frame(或matrix)那么

x[ ,apply(x, 2, function(z) !any(is.na(z)))]

由于您的示例使用NULL,is.na(·)将替换为is.null(·)

或者,您可以查看subset(·).

于 2009-01-24T22:07:32.417 回答
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
于 2014-11-17T19:35:02.810 回答
0

此外,如果您的数据框是,您可以使用sqldf库来执行此操作x

library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
                 WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")
于 2019-04-06T01:02:36.167 回答