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

9
我是一位有用的助手,可以为您翻译。以下是您需要翻译的内容:

我有许多包含约10列和约200000行的大型数据集。并非每一行都包含每个列的值,尽管至少一个列必须包含该行的值才能存在,但我想为允许在行中有多少个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 
 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,而是关注总共有多少个NA

或者,这个数据框是通过合并几个数据框生成的。

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

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

也许合并函数可以进行修改?
谢谢。
4个回答

17

使用rowSums函数。从数据框(df)中删除包含恰好nNA值的行:

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

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

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

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


2
+1 对于使用 n 的使用。您可能需要解释一下 n 代表什么。 - Ricardo Saporta
这会在 df 中生成一个名为 row.names 的新列,为什么会这样呢?这是 R 中我不理解的现象之一。有时函数会输出我意料之外的额外内容。 - Zhubarb

4
如果`dat`是您的数据框的名称,则以下内容将返回您要查找的内容:
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
如果d是您的数据框,请尝试以下操作:
d <- d[rowSums(is.na(d)) < 2,]

1
这将返回一个数据集,其中每行最多缺少两个值:
dfrm[ apply(dfrm, 1, function(r) sum(is.na(x)) <= 2 ) , ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接