如何从包含n * NA的数据框中删除行

时间:2013-08-08 01:03:03

标签: r filter merge rows na

我有许多大型数据集,大约有10列,大约有200000行。并非所有列都包含每行的值,尽管至少有一列必须包含要存在的行的值,我想设置一行允许的NA个阈值。

我的Dataframe看起来像这样:

 ID q  r  s  t  u  v  w  x  y  z
 A  1  5  NA 3  8  9  NA 8  6  4
 B  5  NA 4  6  1  9  7  4  9  3 
 C  NA 9  4  NA 4  8  4  NA 5  NA
 D  2  2  6  8  4  NA 3  7  1  32 

我希望能够删除包含超过2个包含NA的单元格的行以获取

ID q  r  s  t  u  v  w  x  y  z
 A 1  5  NA 3  8  9  NA 8  6  4
 B 5  NA 4  6  1  9  7  4  9  3 
 D 2  2  6  8  4  NA 3  7  1  32 

complete.cases删除包含任何NA的所有行,我知道可以在某些列中删除包含NA的行,但有没有办法对其进行修改以使其不是具体关于哪些列包含NA,但总数中包含多少?

或者,通过使用

合并多个数据帧来生成此数据帧
    file1<-read.delim("~/file1.txt")
    file2<-read.delim(file=args[1])

    file1<-merge(file1,file2,by="chr.pos",all=TRUE)

也许合并功能可以改变?

由于

4 个答案:

答案 0 :(得分:14)

使用rowSums。要从包含精确 n df值的数据框(NA)中删除行:

df <- df[rowSums(is.na(df)) != n, ]

或删除包含 n 或更多NA值的行:

df <- df[rowSums(is.na(df)) < n, ]

在两种情况下,当然用所需的数字替换n

答案 1 :(得分:4)

如果dat是您的data.frame的名称,则以下内容将返回您要查找的内容:

keep <- rowSums(is.na(dat)) < 2
dat <- dat[keep, ] 

这是做什么的:

is.na(dat) 
# returns a matrix of T/F
# note that when adding logicals 
# T == 1, and F == 0

rowSums(.)
# quickly computes the total per row 
# since your task is to identify the
# rows with a certain number of NA's 

rowSums(.) < 2 
# for each row, determine if the sum 
# (which is the number of NAs) is less
# than 2 or not.  Returns T/F accordingly 

我们使用最后一个语句的输出 确定要保留的行。请注意,没有必要实际存储最后一个逻辑。

答案 2 :(得分:2)

如果d是您的数据框,请尝试以下操作:

d <- d[rowSums(is.na(d)) < 2,]

答案 3 :(得分:1)

这将返回一个数据集,其中每行最多缺少两个值:

dfrm[ apply(dfrm, 1, function(r) sum(is.na(x)) <= 2 ) , ]