R数据帧过滤

时间:2011-04-07 19:37:17

标签: r dataframe

我有一个数据帧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的所有新数据帧。

提前致谢。

3 个答案:

答案 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))), ]