在R语言中基于group_by按条件统计唯一玩家数量
按队伍统计分数≥1的唯一玩家数解决方案
给定数据集:
dat <- data.frame(team = c("new", "new", "old"), player = c("bob", "bill", "sue"), score = c(1, 0, 3))
要求在group_by框架内完成统计,不能提前筛选数据集。
正确代码实现
直接在n_distinct里通过索引筛选符合分数条件的玩家即可,逻辑清晰且避免类型问题:
library(dplyr) dat %>% group_by(team) %>% summarise(total_players = n_distinct(player[score >= 1]))
运行后得到结果:
# A tibble: 2 × 2 team total_players <chr> <int> 1 new 1 2 old 1
原代码的问题
你之前用ifelse的写法,当player是因子类型(data.frame默认把字符串转成因子)时,ifelse会自动把因子转成字符向量,虽然这个小例子里可能看不出问题,但在复杂数据中容易触发类型不一致的bug。而player[score >= 1]是直接提取符合条件的玩家值,自动跳过不符合的行,写法更稳妥。
另外还有一种等价写法,用cur_data()获取当前分组数据后筛选:
dat %>% group_by(team) %>% summarise(total_players = n_distinct(filter(cur_data(), score >= 1)$player))
内容的提问来源于stack exchange,提问作者DJC
相关产品推荐
相关产品推荐

