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

如何统计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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:45:30