2013-01-18 101 views
3

我有一個包含多個列的數據框。 我想選擇沒有NA的行(與complete.cases相同), 和所有列都相同。 例如,對於從數據框中選擇具有相同列的行

> f <- data.frame(a=c(1,NA,NA,4),b=c(1,NA,3,40),c=c(1,NA,5,40)) 
> f 
    a b c 
1 1 1 1 
2 NA NA NA 
3 NA 3 5 
4 4 40 40 

我想要的矢量TRUE,FALSE,FALSE,FALSE只選擇第一行,因爲那裏所有3列是相同的,沒有一個NA

我可以做

Reduce("==",f[complete.cases(f),]) 

但創建其中我喜歡以避免(以節省存儲器)的中間數據幀。

+0

是您的數據的所有數字? – joran

+3

你知道在SO和Rhelp上交叉發現被認爲是糟糕的形式嗎? –

+0

@DWin:爲什麼?是否在某處記錄? – sds

回答

1

試試這個:

R > index <- apply(f, 1, function(x) all(x==x[1])) 
R > index 
[1] TRUE NA NA FALSE 
R > index[is.na(index)] <- FALSE 
R > index 
[1] TRUE FALSE FALSE FALSE 
+1

這似乎在玩具的例子,謝謝,但它需要永恆的真正的數據集與766,950行和2列 – sds

+0

如果只有2列,嘗試'f [,1] == f [,2]'?然後用'FALSE'替換NA? – liuminzhao

+0

'data.table'中可能有一個快速的方法來做到這一點,但我無法弄清楚。標記爲吸引'data.table'專家。 – Michael

0

最好的(IMO)的解決方案是從David Winsemius

which(rowSums(f==f[[1]]) == length(f)) 
+0

解決方案很好。因爲你只是發佈了@Dinin的答案,所以-1不會將其標記爲社區wiki。 – GSee

+0

@GSee:我不知道「將此標記爲社區維基」是什麼意思。你怎麼做,我刪除我的答案? – sds

+0

編輯你的答案(點擊編輯鏈接),然後在右側輸入你的答案的地方,有一個複選框,上面寫着「社區wiki」 – GSee

相關問題