You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:47:52