选择矩阵中仅满足指定条件但R中没有其他内容的元素

时间:2013-01-10 10:17:04

标签: r plyr

我有一个矩阵'mat',有两行以下形式:

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'的变量,它只包含数字0。

neg <- 0

我想在矩阵的第一列中选​​择那些在第二列中只有'neg'的元素。

所以不是说mat [mat [,1]%in%0,1]而是选择第一行中每个至少有一个0的数字,我想只得到那些只有0,在这个例子中只选择4个。

2 个答案:

答案 0 :(得分: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中唯一的类别,其中neg列中的值只有V2,从而生成一个列表: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 

答案 1 :(得分: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))}))))