2013-01-10 111 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))})))) 
相关问题