我想知道包含多个不同(因子)值的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循环需要一段时间。
答案 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