如何对包含不同因子值的ID进行子集化

时间:2014-02-03 14:48:43

标签: r subset

我想知道包含多个不同(因子)值的ID的子集的最佳方法是什么。

所以,我们可以说我的数据是这样的:

 Id <- c(1,2,3,4,4,5,5,6,6)
 FactorValue <- c(1,1,1,1,2,2,2,2,1)
 data <- as.data.frame(cbind(Id,FactorValue))
 print(data)
   Id FactorValue
1  1           1
2  2           1
3  3           1
4  4           1
5  4           2
6  5           2
7  5           2
8  6           2
9  6           1

因此,我希望选择ID 4和6,因为存在具有相同ID的不同因子值。我的数据有超过100万的观察结果,所以我正在寻找一种有效的方法。到目前为止,我已经走到了这一步,但我非常确定这样做有更好的方法:

a <- subset(data,data$FactorValue == 1)
b <- subset(data,data$FactorValue == 2)

ab <- rep(NA, length(data)) # vector for Id's where there are different factor values  

for (i in 1:nrow(a)) {
     for (k in 1:nrow(b)) {
         if (a$Id[i] == b$Id[k]){
              ab[i] <- a$Id[i]
         }  
     }
}
print(ab)
[1] NA NA NA  4  6

毋庸置疑,运行带有超过百万次观测的for循环需要一段时间。

3 个答案:

答案 0 :(得分:1)

使用ave

data[ave(data$FactorValue, data$Id, FUN = function(x) length(unique(x))) > 1, ]
#   Id FactorValue
# 4  4           1
# 5  4           2
# 8  6           2
# 9  6           1

答案 1 :(得分:0)

这是一种方法:

sort(unique(data$Id))[tapply(data$FactorValue, data$Id, 
                             function(x) length(unique(x)) > 1)]
# [1] 4 6

答案 2 :(得分:0)

data[data$Id %in% which(tapply(FactorValue, Id, function(x) length(unique(x))) > 1),]
#   Id FactorValue
# 4  4           1
# 5  4           2
# 8  6           2
# 9  6           1