2013-01-03 64 views
1

我想獲取特定值(此處爲RATIO1和RATIO 2)爲NaN的所有行,並保留它們。R獲取所有值爲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

+1

爲什麼不排第4行? – joran

+0

見編輯,即時。 – hendrik

+0

可以這樣說:比率來自特定的來源,我想獲得原始特定的「行」,例如比例3 - >比率2和比率1應該是NaN(例如,沒有在樣本中找到) – hendrik

回答

4

假設你真的是在處理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 

如果你經常這樣做,10也可能證明是有用的。

5

這裏有一個可能性,使用apply()檢查行一次一個,並確定它們是否完全由NaN S:

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 
+0

我喜歡這個解決方案,它不僅與特定的列綁定。 – Serenthia

0

您可以使用此:在此基礎上從約什O'Briens

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 
+0

但是,這將保留第2列和第3列中包含「NA」(而不僅僅是「NaN」)的行... –

+0

您是對的!我錯過了這個以及data.frame的子集錯誤...我已經更新了我的答案,這與下面的joran的答案沒有什麼不同。 – sinclairjesse

1

增強的解決方案。

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 
#