2013-01-10 34 views
0

別的我有以下形式的兩行的矩陣「墊子」:選擇元素僅滿足規定條件,但沒有中的R

mat: 

1 0 
1 2 
1 3 
1 5 
1 9 
1 4 
1 7 
1 11 
1 8 
2 3 
2 4 
2 2 
3 9 
3 0 
4 0 
5 0 
5 13 
6 22 
6 0 

我定義了一個名爲「NEG」 variale其只包括數字0.

neg <- 0 

我想選擇矩陣的第一列中第二列中只有'neg'的那些元素。的

所以與其說墊[在%墊[1]%0,1]這將選擇具有第二至少一個0在第一行中的每個數字,我想只得到那些有隻有0,在這個例子中只有4個會被選中。

回答

3

我會用plyr這一點。但是,第一次讀到您的數據:

dat = read.csv(textConnection("1 0 
1 2 
1 3 
1 5 
1 9 
1 4 
1 7 
1 11 
1 8 
2 3 
2 4 
2 2 
3 9 
3 0 
4 0 
5 0 
5 13 
6 22 
6 0"), header = FALSE, sep = "") 

和裝載plyr後,我想找到V1獨特的類別,其只有在V2列的值等於neg,導致列表:true_values

require(plyr) 
neg = 0 
test = ddply(dat, .(V1), summarise, bool = all(V2 == neg)) 
>  test 
    V1 bool 
1 1 FALSE                 
2 2 FALSE                 
3 3 FALSE                 
4 4 TRUE                 
5 5 FALSE                 
6 6 FALSE 
true_values = test[["V1"]][test[["bool"]]] 
> true_values 
[1] 4 

一旦我們有了這個列表中,我們可以子集原始數據集:

> dat[dat[["V1"]] %in% true_values,] 
    V1 V2 
15 4 0 

或者,我們可以生成一個布爾值向量直接指定從dat選擇哪些元素:

test = ddply(dat, .(V1), mutate, bool = all(V2 == neg)) 

...並執行子集:

> dat[test[["bool"]],] 
    V1 V2 
15 4 0 
+0

當NEG有多個值 – user1723765

+0

這也是沒有在你的問題中指定這不起作用。如果您需要更具體的答案,請添加更多詳細信息。 –

+0

以及NEG可以是一個矢量說NEG = 0,1,3,5,7然後我想測試負 – user1723765

0

這僅適用於您的具體情況,但你可以tapply使用:

as.numeric(names(which(tapply(a[,2],a[,1],sum)==0))) 

如果你想到的第一列的因素,然後tapply計算在第二列的總和的每個級別第一個因素。

和多值的情況下,這樣的事情 - 不可否認的難看的 - 應該工作:

as.numeric(names(which(tapply(dat[,2],dat[,1],FUN=function(x){all(unique(x)%in%neg & length(x)==length(neg))})))) 
相關問題