如何在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)可以换成%bna.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
相关产品推荐
相关产品推荐

