如何在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) )
对应表格:
| firmid | year | c1 | c2 | cn |
|---|---|---|---|---|
| 1 | 2000 | NA | 4 | text |
| 1 | 2001 | 3 | 2 | text |
| 1 | 2002 | NA | NA | NA |
| 1 | 2003 | 2 | 3 | NA |
| 1 | 2004 | NA | 8 | NA |
需求
新增一列non-missing-columns,统计每行的非缺失数据列数量,最终结果如下:
| firmid | year | c1 | c2 | cn | non-missing-columns |
|---|---|---|---|---|---|
| 1 | 2000 | NA | 4 | text | 4 |
| 1 | 2001 | 3 | 2 | text | 5 |
| 1 | 2002 | NA | NA | NA | 2 |
| 1 | 2003 | 2 | 3 | NA | 4 |
| 1 | 2004 | NA | 8 | NA | 3 |
错误尝试代码
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(...)))))
错误原因说明
- 列名格式问题:列名包含连字符,必须用反引号
`包裹,否则R会将non-missing-columns解析为减法运算,导致语法错误; - 不必要的分组:
firmid和year的组合每行唯一,分组操作完全多余; - 求和逻辑问题:
rowSums是更直接的按行统计非缺失值数量的函数,比分组后求和更简洁高效。
内容的提问来源于stack exchange,提问作者fsure
相关产品推荐
相关产品推荐

