R语言按组统计多列有效观测数并生成新列的问题
问题分析与解决
你的问题出在两个核心点:
- 无需提前复制原始列并命名为含
Count的列,直接针对原问题列(Question开头的列)处理即可,多此一举反而容易引发错误。 - 匿名函数里的
.指代的是整个分组后的数据集,而非当前遍历的列x,所以sum(!is.na(.))计算的是分组内所有列的非NA总数,自然所有行的数值完全一致。
修正方案(推荐,一步完成双指标计算)
直接在同一个group_by操作里同时计算平均值和有效观测数,不需要额外复制列,代码更简洁高效:
df <- df %>% group_by(Organization, Year) %>% mutate( # 计算每个问题列的分组平均值 across(contains('Question'), mean, na.rm = TRUE, .names = "{.col}_average"), # 计算每个问题列的分组有效观测数(非NA的数量) across(contains('Question'), ~sum(!is.na(.x)), .names = "{.col}_ncount") ) %>% ungroup()
若坚持使用提前复制的Count列(不推荐)
如果你一定要保留之前复制的Count列,需要把匿名函数里的.明确替换为当前列参数.x:
df <- df %>% group_by(Organization, Year) %>% mutate(across(contains('Count'), ~sum(!is.na(.x)), .names = "{.col}_ncount")) %>% ungroup()
这里的~sum(!is.na(.x))是function(x) sum(!is.na(x))的简写,.x会精准指向当前遍历的列,从而正确统计该列在分组内的有效观测数。
内容的提问来源于stack exchange,提问作者vp2019
相关产品推荐
相关产品推荐

