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

我有一些大数据集,大约有10列,〜200000行。 并不是所有的列都包含每行的值,但是至less有一列必须包含该行所存在的值,我想设置一个阈值,以允许一行中允许有多less个NA

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

  ID qrstuvwxyz 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 

我希望能够删除包含多个包含NA的单元格的行以获得

 ID qrstuvwxyz 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 ,但总共有多less做?

另外,这个dataframe是通过使用几个dataframe合并生成的

  file1<-read.delim("~/file1.txt") file2<-read.delim(file=args[1]) file1<-merge(file1,file2,by="chr.pos",all=TRUE) 

也许合并function可能会改变?

谢谢

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

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

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

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

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

如果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 

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

如果d是你的dataframe,试试这个:

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

这将返回一个数据集,每行至多丢失两个值:

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