我有一个矩阵'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个。
答案 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))}))))