9

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

我的数据框看起来像这样:

 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删除所有包含 any 的行NA,我知道可以删除NA某些列中包含的行,但是有没有办法修改它,以便不具体说明哪些列包含NA,但总共有多少?

或者,这个数据帧是通过使用合并几个数据帧来生成的

    file1<-read.delim("~/file1.txt")
    file2<-read.delim(file=args[1])

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

也许合并功能可以改变?

谢谢

4

4 回答 4

17

使用rowSums. 要从数据框 ( df) 中删除恰好包含n 个 NA值的行:

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

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

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

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

于 2013-08-08T01:25:05.240 回答
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 

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

于 2013-08-08T01:28:27.640 回答
2

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

d <- d[rowSums(is.na(d)) < 2,]
于 2013-08-08T01:25:08.473 回答
1

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

dfrm[ apply(dfrm, 1, function(r) sum(is.na(x)) <= 2 ) , ]
于 2013-08-08T01:24:15.573 回答