R语言:按x聚合z子组中y的不重复值(避免重复计数)
问题解决:多维度分组去重计数并保留原变量
需求:对现有数据框,先按x、z分组计算y的唯一值数量,再在x维度聚合这些y的唯一值(同一x下不同z组的y唯一值不重复计数),同时保留原数据所有变量,无需额外创建表关联。
示例数据
df <- tibble(x = c("A1", "A1", "A1", "A1", "A1", "A2", "A2", "A2"), y = c(1, 1, 2, 1, 1, 1, 1, 1), z = c("a", "a", "a", "b", "b", "c", "c", "d"))
已完成步骤:按x、z分组计算y的唯一值数量
df |> mutate( xz_n_dist = n_distinct(y), .by = c(x, z) )
输出结果:
x y z xz_n_dist <chr> <dbl> <chr> <int> 1 A1 1 a 2 2 A1 1 a 2 3 A1 2 a 2 4 A1 1 b 1 5 A1 1 b 1 6 A2 1 c 1 7 A2 1 c 1 8 A2 1 d 1
完整解决方案
在现有代码基础上,通过嵌套分组计算直接添加x_n_dist列:
df |> mutate( xz_n_dist = n_distinct(y), .by = c(x, z) ) |> mutate( x_n_dist = length(unique(unlist(map(split(y, z), unique)))), .by = x )
最终输出结果
x y z xz_n_dist x_n_dist <chr> <dbl> <chr> <int> <int> 1 A1 1 a 2 3 2 A1 1 a 2 3 3 A1 2 a 2 3 4 A1 1 b 1 3 5 A1 1 b 1 3 6 A2 1 c 1 2 7 A2 1 c 1 2 8 A2 1 d 1 2
代码解释
- 第一步按
x、z分组,用n_distinct(y)计算每组内y的唯一值数量,生成xz_n_dist列; - 第二步按
x分组,用split(y, z)将每个x组内的数据按z拆分,再通过map(unique)提取每个z组的y唯一值,最后用unique(unlist(...))合并并去重,统计长度得到x维度下不重复的y唯一值总数,生成x_n_dist列。
内容的提问来源于stack exchange,提问作者Abigail
相关产品推荐
相关产品推荐

