2013-03-05 71 views
0

如果5列(5-10)中的任何一列在我的列表中包含一個因子(keep.list),我想要創建兩個子集我的數據以及其中沒有任何列包含keep.list中的任何內容的列。這裏就是我到目前爲止,但不能讓它的子集的權利:基於列表中是否包含一個多個變量來設置數據

test.cols <- c(5:10) 
keep.list <- c("dog","cat","mouse","bird") 

data.sub.IN <- data.big[which(any(keep.list %in% data.big[test.cols])),] 

data.sub.NOT.IN <- data.big[which(any(keep.list !%in% data.big[test.cols])),] 

我覺得which()any()可以幫助,但我可能是錯的,我不知道如何處理「不包含」情況下,如通常的!命令不起作用。

+1

使用'any'時which'你不需要'或'%in%'構造一個索引。並不是說你有一個特別完整的例子。我會認爲'任何'會將結果摺疊成一個單一的值,這不是我所理解的你想要的值。 – 2013-03-05 03:17:57

回答

3

可以使用apply做到這一點:

keep <- apply(data.big[test.cols], 1, function(r) any(r %in% keep.list)) 
data.sub.IN <- data.big[keep, ] 
data.sub.NOT.IN <- data.big[!keep, ] 

apply適用的功能將數據幀的每一行。在這種情況下,對於每一行,它檢查該行中的任何項目是否在keep.list中。

+0

像冠軍一樣工作。非常感激。 – km5041 2013-03-05 03:08:45

1

我會和@ DavidRobinsons的回答一起去的,但是如果你想保持它的形式,你需要移動!。要取消%in%,您需要在邏輯運算符的第一部分之前加上!

B <- 1:4 
A <- 3:6 
A %in% B 
[1] TRUE TRUE FALSE FALSE 
!A %in% B 
[1] FALSE FALSE TRUE TRUE 

因此,對於您的情況:

data.sub.NOT.IN <- data.big[which(any(!keep.list %in% data.big[test.cols])),] 

但同樣,在這種情況下使用apply是一個更好的選擇,我想。

編輯 基於@迪文的評論,這可能無法正常工作(硬說沒有如數據集),你可能真的需要:

data.sub.NOT.IN <- data.big[which(!any(keep.list %in% data.big[test.cols])),] 
+0

沒有在我構造的簡單測試用例上返回正確的結果。我想如果避免使用'apply'可能會很好,但在這種情況下,我認爲你被OP的缺乏理解所誤導。 – 2013-03-05 03:33:55

相關問題