如何在R中按Point.ID最后两位分组求均值并生成新列?
解决方案
不需要提前拆分数据集,直接通过提取Point.ID的最后两位来分组计算均值即可,用dplyr和stringr工具包就能实现:
library(dplyr) library(stringr) # 读取原始数据 streams <- read.csv("Soil Temp Gradient - DATA.csv") # 核心数据处理流程 result <- streams %>% # 筛选出你需要的Stream 1 Zone 1数据范围 filter(between(Point.ID, 11000, 11320)) %>% # 提取Point.ID最后两位,补零格式化为两位字符串 mutate(Group_Point = str_pad(str_sub(Point.ID, start = -2), width = 2, pad = "0")) %>% # 按Zone和分组后的Point后缀分组 group_by(Zone, Group_Point) %>% # 计算温度均值并保留三位小数 summarise(Avg.Pt.Temp = round(mean(Point.Temp), 3)) %>% # 重命名列以匹配目标格式 rename(Point.ID = Group_Point) %>% ungroup() # 查看结果 print(result)
关键步骤说明
str_sub(Point.ID, start = -2):不管Point.ID是几位数字,都能精准提取最后两位,这是分组的核心依据。str_pad(...):把提取出的数字补成两位字符(比如1转为01),和你想要的目标格式完全匹配。group_by()+summarise():完成分组计算均值的核心操作,一步到位替代你拆分多个数据集的繁琐操作。
你之前的操作问题
- 提前拆分多个子数据集完全没必要,反而会增加后续合并计算的复杂度;
starts_with()、ends_with()是列选择函数,用来筛选数据框的列名,不是用来处理行的分组或筛选逻辑,所以用它们来处理Point.ID的分组是方向错误的。
内容的提问来源于stack exchange,提问作者Faye K
相关产品推荐
相关产品推荐

