我有许多大型数据集,大约有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)
也许合并功能可以改变?
由于
答案 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 ) , ]