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

如何在R中按firmid和year分组统计每行非缺失数据列数?

问题:统计每行非缺失列的数量

原始数据

df <- data.frame(
  firmid = c(1, 1, 1, 1, 1),
  year = c(2000, 2001, 2002, 2003, 2004),
  c1 = c(NA, 3, NA, 2, NA),
  c2 = c(4, 2, NA, 3, 8),
  cn = c("text", "text", NA, NA, NA)
)

对应表格:

firmidyearc1c2cn
12000NA4text
1200132text
12002NANANA
1200323NA
12004NA8NA

需求

新增一列non-missing-columns,统计每行的非缺失数据列数量,最终结果如下:

firmidyearc1c2cnnon-missing-columns
12000NA4text4
1200132text5
12002NANANA2
1200323NA4
12004NA8NA3

错误尝试代码

df %>%
group_by(firmid, year) %>%
mutate(non-missing-columns = sum(!is.na(.)))

正确实现方法

方法一:tidyverse+rowSums(推荐)

library(dplyr)

df %>%
  mutate(`non-missing-columns` = rowSums(!is.na(.)))

方法二:基础R写法

df$`non-missing-columns` <- rowSums(!is.na(df))

方法三:使用purrr包

library(dplyr)
library(purrr)

df %>%
  mutate(`non-missing-columns` = pmap_int(., ~ sum(!is.na(c(...)))))

错误原因说明

  1. 列名格式问题:列名包含连字符,必须用反引号`包裹,否则R会将non-missing-columns解析为减法运算,导致语法错误;
  2. 不必要的分组:firmid和year的组合每行唯一,分组操作完全多余;
  3. 求和逻辑问题:rowSums是更直接的按行统计非缺失值数量的函数,比分组后求和更简洁高效。

内容的提问来源于stack exchange,提问作者fsure

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:44:51