在 R 中过滤数据
Posted
技术标签:
【中文标题】在 R 中过滤数据【英文标题】:Filtering data in R 【发布时间】:2010-10-03 08:48:30 【问题描述】:我有一个 CSV 数据文件,我可以使用 read.csv()
在 R 中加载它
一些数据丢失了,所以我想将数据框减少到完全由非缺失数据组成的集合,即如果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数据只有四行。
【问题讨论】:
【参考方案1】:另外,如果x
是您的数据框,您可以使用sqldf
库来完成:
library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")
【讨论】:
【参考方案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
【讨论】:
我不明白这个答案。这将始终只返回一行【参考方案3】:如果x
是你的data.frame
(或matrix
)那么
x[ ,apply(x, 2, function(z) !any(is.na(z)))]
由于您的示例使用NULL
,因此is.na(·)
将替换为is.null(·)
您也可以查看subset(·)
。
【讨论】:
谢谢@rguha,这很有用。如果我想在 csv 的特定列中删除任何小于 5 的值,这将如何工作? @Rodolphe 删除sales
列中小于 5 的任何值:data[data$sales >= 5, ]
更直接【参考方案4】:
您可以使用 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 行。
【讨论】:
以上是关于在 R 中过滤数据的主要内容,如果未能解决你的问题,请参考以下文章