R得到所有值都是NaN的行

时间:2013-01-03 23:22:34

标签: r filter

我试图获取特定值(此处为RATIO1和RATIO 2)为NaN的所有行保留它们。

考虑像

这样的数据框
data.frame(ID=c(1,2,4,6,7),RATIO1=c(NaN,NaN,0.2,9.5,6), 
           RATIO2=c(NaN,NaN,0.5,NaN,6), RATIO3=c(0.3,0.2,4,NaN,5))

 ID RATIO1 RATIO2 RATIO3
1  1    NaN    NaN    0.3
2  2    NaN    NaN    0.2
3  4    0.2    0.5      4
4  6    9.5    NaN    NaN
5  7      6      6      5

我希望它看起来像这样

 ID RATIO1 RATIO2 RATIO3
1  1    NaN    NaN    0.3
2  2    NaN    NaN    0.2

我可以使用is.na()或complete.cases()< - 这将删除行。

Thx

4 个答案:

答案 0 :(得分:5)

这是一种可能性,使用apply()一次检查一行,并确定它们是否完全由NaN组成:

df[apply(df[2:3], 1, function(X) all(is.nan(X))),]
#   ID RATIO1 RATIO2 RATIO3
# 1  1    NaN    NaN    0.3
# 2  2    NaN    NaN    0.2

答案 1 :(得分:5)

假设您确实在处理NaN而不是某些任意字符值,请尝试以下方法:

dat <- data.frame(ID=c(1,2,4,6,7),RATIO1=c(NaN,NaN,0.2,9.5,6), RATIO2=c(NaN,NaN,0.5,NaN,6), RATIO3=c(0.3,0.2,4,NaN,5))
> dat[is.nan(dat$RATIO1) & is.nan(dat$RATIO2),]
  ID RATIO1 RATIO2 RATIO3
1  1    NaN    NaN    0.3
2  2    NaN    NaN    0.2
如果你经常这样做,

is.finite也可能有用。

答案 2 :(得分:1)

Josh O'Briens基于此的增强型解决方案。

df[rowSums(is.nan(as.matrix(df[2:3])))>1,]
#
# as.matrix because is.nan requires matrix  (but is.na doesn't)
# rowSums for speed gain
#

答案 3 :(得分:0)

你可以用这个:

df <- data.frame(ID=c(1,2,4,6,7),RATIO1=c(NaN,NaN,0.2,9.5,6), 
                   RATIO2=c(NaN,NaN,0.5,NaN,6), RATIO3=c(0.3,0.2,4,NaN,5))

df[is.nan(df$RATIO1) & is.nan(df$RATIO2),]

  ID RATIO1 RATIO2 RATIO3
1  1    NaN    NaN    0.3
2  2    NaN    NaN    0.2