如何统计R语言data.frame中指定月份后列的N值数量?
解决方案
针对你的需求,这里提供两种高效的实现方案,分别适配不同数据规模的场景:
方法一:dplyr 按行处理(代码简洁易读)
如果数据规模不是极端庞大,用dplyr的行处理方式逻辑清晰,便于后续维护:
library(dplyr) # 定义月份列顺序,确保和1-12月一一对应 month_cols <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec") # 计算每个ID指定月份后的N数量 df_result <- df %>% rowwise() %>% mutate( N_count = sum( pick(all_of(month_cols[(month_num + 1):12])) == "N", na.rm = TRUE ) ) %>% ungroup() # 查看核心结果 df_result %>% select(ID, month_num, N_count)
运行后会得到符合预期的结果:
ID month_num N_count 1 A 3 0 2 B 5 1 3 C 2 2
方法二:base R 向量化操作(大数据量首选)
如果数据量极大,按行处理效率偏低,推荐用向量化的矩阵操作,运行速度更快:
# 定义月份列顺序 month_cols <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec") # 提取月份列转为矩阵 month_matrix <- as.matrix(df[, month_cols]) # 生成逻辑矩阵:标记每个位置是否属于month_num之后的月份 after_month_flag <- outer(df$month_num, 1:12, function(x, y) y > x) # 统计每行符合条件的N数量 df$N_count <- rowSums(month_matrix == "N" & after_month_flag, na.rm = TRUE) # 查看核心结果 df[, c("ID", "month_num", "N_count")]
处理多ID多行的场景
如果每个ID存在多行数据,需要按ID汇总总N数,可以在上述代码基础上增加分组汇总:
dplyr 版本
df_multi_summary <- df %>% rowwise() %>% mutate(row_N = sum(pick(all_of(month_cols[(month_num + 1):12])) == "N", na.rm = TRUE)) %>% ungroup() %>% group_by(ID) %>% summarise(total_N = sum(row_N, na.rm = TRUE))
base R 版本
# 先计算每行的N数量 df$row_N <- rowSums(as.matrix(df[, month_cols]) == "N" & outer(df$month_num, 1:12, function(x,y) y>x), na.rm=TRUE) # 按ID汇总 total_N_summary <- aggregate(row_N ~ ID, data = df, sum, na.rm = TRUE)
内容的提问来源于stack exchange,提问作者jackDanielle
相关产品推荐
相关产品推荐

