我有一个数据帧df,如下所示:
A B C
NA 1 2
2 NA 3
4 5 6
7 8 9
我要做的是删除所有包含NA
的行。
如果我使用
apply(df,1,function(row) all(!is.na(row)))
我得到所有行的列表为TRUE(如果行不包含NA)和FALSE(如果行包含NA)。 但是如何获得rowname以便我可以创建一些像
df2<-df[-c(list of rows that contains NA),]
将为我提供行中NA的所有新数据帧。
提前致谢。
答案 0 :(得分:3)
假设您有一个如下所示的数据框:
A B C
1 NA 1 2
2 2 NA 3
3 4 5 6
4 7 8 9
然后尝试:
df1[apply(df1,1,function(x) !any(is.na(x))), ]
A B C
3 4 5 6
4 7 8 9
它不使用rownames而是使用逻辑向量。我想约书亚和我用不同的方式读了你的问题,但我们使用了相同的方法。
约书亚的建议更为紧凑:
> na.omit(df1)
A B C
3 4 5 6
4 7 8 9
它提醒我应该使用:
> df1[complete.cases(df1), ]
A B C
3 4 5 6
4 7 8 9
答案 1 :(得分:1)
您可以使用apply
调用中的逻辑向量来索引data.frame。
> Data[!apply(Data,1,function(row) all(!is.na(row))),]
A B C
1 NA 1 2
2 2 NA 3
> # or like this:
> Data[apply(Data,1,function(row) any(is.na(row))),]
A B C
1 NA 1 2
2 2 NA 3
答案 2 :(得分:0)
is.na
上的 data.frame
会返回matrix
,这是更适合申请的候选人:
df <- read.table(textConnection(" A B C
NA 1 2
2 NA 3
4 5 6
7 8 9
"))
## a matrix
is.na(df)
## logical for selecting rows that are all NA
apply(df, 1, function(x) all(is.na(x)))
## one liner
df[!apply(df, 1, function(x) all(is.na(x))), ]