如何在R中创建变量统计month_x大于对应max_x的次数
解决方案
方法一:Base R 实现
利用列名的对应关系提取目标列,逐行比较后求和:
# 提取所有month和max开头的列 month_cols <- grep("^month", names(df), value = TRUE) max_cols <- grep("^max", names(df), value = TRUE) # 逐行统计month_x > max_x的有效数量(自动忽略NA) df$count <- rowSums(df[month_cols] > df[max_cols], na.rm = TRUE)
运行后查看结果:
df # id month1 month2 month3 max1 max2 max3 count # 1 Lars 1 2 NA 0 3 NA 1 # 2 Susan 1 2 3 0 1 2 2 # 3 Juan 1 2 3 2 3 4 0
方法二:Tidyverse 实现
通过转置长格式数据完成比较,再分组求和:
library(tidyverse) df <- df %>% # 拆分列名,将month/max和数字部分分离 pivot_longer(cols = -id, names_to = c(".value", "num"), names_pattern = "(month|max)(\\d+)") %>% # 标记month是否大于对应max mutate(gt_flag = month > max) %>% # 按id分组统计有效标记数 group_by(id) %>% summarise(count = sum(gt_flag, na.rm = TRUE)) %>% # 合并回原数据 right_join(df, by = "id") %>% # 调整列顺序 select(id, month1:max3, count)
核心说明
- 两种方案都适配
month_x和max_x的命名规则,新增更多组(如month4/max4)时无需修改代码 na.rm = TRUE会自动忽略同时为NA的month和max组合,不纳入统计
内容的提问来源于stack exchange,提问作者connor monie
相关产品推荐
相关产品推荐

