r - 在R中的data.frame中找到与所有其他行具有不同值的行
问题描述
在 data.framef
中,我想知道如何找到以下内容(使用 BASE R):
对于具有或更多行且除 ONE 之外的所有行值都相同id
的集群,找到该集群中不同的 ONE 行值?f
3
id
换句话说,只有具有 3 行或更多行且具有除 ONE 之外的所有相同行值的集群才是目标,而不仅仅是具有 3 行或更多行的所有集群。
通过id
集群,我的意思是好像我们这样做:split(f, f$id)
.
注意:这是一个玩具示例,感谢功能性答案(以下答案未更新!)。
f <- data.frame(id = c(rep("AA",4), rep("BB",3), rep("CC",3)), X = c(2,2,2,3,1,1,1,0,1,2),
Y = c(5,8,8,8,6,3,1,6,1,1))
期望的输出:
data.frame(id = c("AA", "AA", "CC"), value = c(3, 5, 6), var.name = c("X", "Y", "Y"))
# id value var.name
# 1 AA 3 X # HERE `3` on `X` is the ONE for `AA` cluster in `f`
# 2 AA 5 Y # HERE `5` on `Y` is the ONE for `AA` cluster in `f`
# 3 CC 6 Y # HERE `6` on `Y` is the ONE for `CC` cluster in `f`
解决方案
您可以stack()
使用 data.frame 进行子集化ave()
,保留 ID 和索引变量的组合具有两个不同值并且值、组和索引的组合是唯一的情况。
f_long <- cbind(f[1], stack(f[-1]))
f_long[with(f_long, ave(values, id, ind, values, FUN = length) == 1 &
ave(values, id, ind, FUN = function(x) length(unique(x))) == 2), ]
id values ind
4 AA 3 X
11 AA 5 Y
18 CC 6 Y