首页 > 解决方案 > 在R中的data.frame中找到与所有其他行具有不同值的行

问题描述

在 data.framef中,我想知道如何找到以下内容(使用 BASE R):

对于具有或更多行且除 ONE 之外的所有行值都相同id的集群,找到该集群中不同的 ONE 行值?f3 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`

标签: rlistloopsdataframesubset

解决方案


您可以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   

推荐阅读