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

如何在RStudio中对列名含相同模式的列生成均值新列?

解决按列名日期分组计算均值的问题

这问题我之前处理类似植被指数数据时也碰到过,用R的话有两种很实用的方法,不管你习惯tidyverse还是base R都能轻松搞定:

方法一:用tidyverse(推荐,逻辑更直观)

如果你平时常用dplyr和tidyr,这个方法步骤清晰,可读性强:

首先加载tidyverse包:

library(tidyverse)

假设你的数据框叫df,执行以下代码:

# 1. 把宽格式数据转成长格式,同时提取月份信息
df_long <- df %>%
  pivot_longer(
    cols = starts_with("NDVI_"),  # 选中所有NDVI开头的列
    names_to = "date_col",        # 原列名存到date_col列
    values_to = "ndvi_value"      # 列值存到ndvi_value列
  ) %>%
  mutate(
    # 去掉NDVI前缀后解析日期,提取月份全名(比如May、June)
    month = format(as.Date(str_remove(date_col, "NDVI_"), "%Y%m%d"), "%B")
  ) %>%
  # 按行号和月份分组,计算每行对应月份的NDVI均值
  group_by(row_number(), month) %>%
  summarise(ndvi_mean = mean(ndvi_value, na.rm = TRUE), .groups = "drop") %>%
  # 转回宽格式,生成带前缀的新列名(比如NDVI_May)
  pivot_wider(
    names_from = month,
    values_from = ndvi_mean,
    names_prefix = "NDVI_"
  )

# 把均值列和原数据合并
df_final <- bind_cols(df, df_long %>% select(-row_number()))

关键细节说明:

  • str_remove(date_col, "NDVI_")用来剥离列名里的前缀,得到纯日期字符串
  • %B生成月份的英文全名(比如May),如果想要缩写(比如Jan)可以换成%b
  • na.rm = TRUE是为了忽略缺失值,避免个别NA导致整行均值失效

方法二:用base R(无需额外加载包)

如果不想依赖第三方包,用base R原生函数也能实现:

# 第一步:筛选所有NDVI开头的列名
ndvi_col_names <- grep("^NDVI_", colnames(df), value = TRUE)

# 第二步:给每个NDVI列匹配对应的月份标签
month_labels <- sapply(ndvi_col_names, function(col_name) {
  # 提取日期部分并转成日期格式
  date_str <- sub("NDVI_", "", col_name)
  # 提取月份全名
  format(as.Date(date_str, "%Y%m%d"), "%B")
})

# 第三步:按月份分组,计算每行均值并添加新列
for (month in unique(month_labels)) {
  # 找到当前月份对应的所有列
  target_cols <- ndvi_col_names[month_labels == month]
  # 计算行均值,生成新列(比如NDVI_May)
  df[[paste0("NDVI_", month)]] <- rowMeans(df[target_cols], na.rm = TRUE)
}

运行完这段代码,你的原数据框df就会自动新增每个月份的均值列啦。

内容的提问来源于stack exchange,提问作者Bryan Alemán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:42:50