如何将两段dplyr分组筛选汇总代码合并为单一数据框
合并dplyr分组统计代码的解决方案
嘿,我来帮你把这两段分组统计的代码合并成一个高效的单一数据框输出,这样你不用重复分组操作,一次就能得到Freq和reason_lv两列的年度统计结果。
首先,先把你的示例数据补全方便测试:
df <- read.table(header=T, text=' Act year MIAPRFCD_J8 MIAPRFCD_55 sum 1 2015 1 0 0 2 2015 0 1 0 3 2015 1 1 0 4 2015 0 0 1 5 2016 1 0 0 6 2016 0 0 0 7 2016 1 1 1 ')
合并后的代码
核心思路是在同一个group_by(year)之后,用summarise同时计算两个统计指标,避免重复分组,提升效率:
library(dplyr) # 合并后的统计代码 result_df <- df %>% group_by(year) %>% summarise( # 原第一段代码的逻辑:统计MIAPRFCD_J8==1 或 MIAPRFCD_55==1的行数 Freq = sum(MIAPRFCD_J8 == 1 | MIAPRFCD_55 == 1, na.rm = TRUE), # 原第二段代码的逻辑:统计sum==1 或 (MIAPRFCD_J8和MIAPRFCD_55都为1)的行数 reason_lv = sum(sum == 1 | (MIAPRFCD_J8 == 1 & MIAPRFCD_55 == 1), na.rm = TRUE) ) # 查看结果 print(result_df)
代码说明
- 用
sum()替代原代码中的n()+filter():因为逻辑判断(比如MIAPRFCD_J8 ==1)会返回布尔值,TRUE对应1,FALSE对应0,sum()直接就能统计满足条件的行数,比先过滤再计数更简洁高效。 - 添加
na.rm=TRUE是为了处理数据中可能存在的缺失值,避免统计结果出现NA。 - 运行后你会得到一个按
year分组,包含Freq和reason_lv两列的整洁数据框。
示例输出
运行上述代码后,你会得到这样的结果:
# A tibble: 2 × 3 year Freq reason_lv <int> <int> <int> 1 2015 3 2 2 2016 2 1
内容的提问来源于stack exchange,提问作者user2797174




