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

R语言按组统计多列有效观测数并生成新列的问题

问题分析与解决

你的问题出在两个核心点:

  1. 无需提前复制原始列并命名为含Count的列,直接针对原问题列(Question开头的列)处理即可,多此一举反而容易引发错误。
  2. 匿名函数里的.指代的是整个分组后的数据集,而非当前遍历的列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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:30:54