R语言:展开层级区间并统计各层级唯一用户数的需求
我来帮你解决这个R语言的数据统计问题~
问题背景
我们有一份包含用户、物品、当前等级和最高等级的数据集,需要针对每个物品,统计从该物品的最低等级到最高等级之间,每个层级对应的唯一用户数量。
输入数据框:
df <- data.frame(user = c("x", "y"), item = c("a", "a"), level = c(1, 1), level_max = c(2, 4))
打印后结果:
user item level level_max 1 x a 1 2 2 y a 1 4
需求与期望输出
核心需求是:对每个item,覆盖从它的最小level到最大level_max的所有层级,统计每个层级下,只要用户的最高等级≥当前层级就算有效的唯一用户数。
期望输出数据框:
target_df <- data.frame(item = c("a", "a", "a", "a"), level = 1:4, count = c(2, 2, 1, 1))
打印后结果:
item level count 1 a 1 2 2 a 2 2 3 a 3 1 4 a 4 1
解决方案:展开层级后统计
你的思路完全正确——先把每个用户的等级范围展开成连续的层级,再按物品+层级维度统计唯一用户数。这里推荐用tidyverse工具包实现,代码简洁易读:
步骤1:加载工具包
library(tidyverse)
步骤2:展开层级并统计
df %>% # 为每个用户生成从当前level到level_max的连续层级序列 mutate(level_seq = map2(level, level_max, ~seq(.x, .y))) %>% # 将序列展开为行 unnest(level_seq) %>% # 按物品和展开后的层级分组,统计唯一用户数 group_by(item, level = level_seq) %>% summarise(count = n_distinct(user), .groups = "drop") %>% # 自动补全物品的所有层级(避免遗漏无用户覆盖的层级) complete(item, level = full_seq(level, 1), fill = list(count = 0))
基础R替代方案(无需额外包)
如果不想加载第三方包,用基础R也能实现:
# 获取每个物品的最大层级 item_max_level <- with(df, tapply(level_max, item, max)) # 生成所有物品的完整层级序列 all_levels <- lapply(item_max_level, function(m) 1:m) # 构建物品-层级的全组合 expand_df <- expand.grid(item = names(all_levels), level = unlist(all_levels)) # 统计每个组合的有效用户数 expand_df$count <- mapply(function(it, lv) { sum(df$item == it & df$level_max >= lv) }, expand_df$item, expand_df$level) # 排序并整理结果 result_base <- expand_df[order(expand_df$item, expand_df$level), ] rownames(result_base) <- NULL
运行上述任意代码,都能得到你需要的目标输出。
内容的提问来源于stack exchange,提问作者Julien Navarre
相关产品推荐
相关产品推荐

