如何从包含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 ) , ]