Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中过滤数据_R_Filtering - Fatal编程技术网

在R中过滤数据

在R中过滤数据,r,filtering,R,Filtering,我有一个CSV数据文件,可以使用read.CSV() 一些数据缺失,因此我希望将数据帧缩减为完全由非缺失数据组成的集合,即,如果NULL出现在任何地方,我希望将该列和该行从过滤数据集中排除 我知道我可以很简单地用内置的R向量运算来实现这一点,但我不太确定到底该怎么做 为了让我的问题更具体一点,这里有一个快速的数据样本,这样你就可以看到我想要做什么 DocID Anno1 Anno7 Anno8 1 7 NULL 8 2

我有一个CSV数据文件,可以使用
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
是唯一包含非空数据的列,并且只有四行包含非空数据。

如果
x
是您的
数据。frame
(或
矩阵
)则

由于您的示例使用了
NULL
is.na(·)
将被
is.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

由于第2列中的NA,应删除第1行。

a此外,如果
x
是您的数据帧,则可以使用
sqldf
库执行此操作:

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
library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
                 WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")
库(sqldf)

结果谢谢@rguha,这很有用。如果我想在csv的某个特定列中去掉小于(比如)5的任何值,这将如何工作?@Rodolphe要去掉
sales
列中小于5的任何值:
data[data$sales>=5,]
更直截了当,我不明白这个答案。这将始终只返回一行
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
library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
                 WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")