使用R按name与name2组合计算数据框pos列的最小最大值
解决方法:按分组计算pos的最小/最大值
这需求在数据处理里很常见,我给你两种常用的实现方式,你可以根据自己的习惯选择:
方法一:使用Base R的aggregate函数
不需要额外安装包,直接用R自带的函数就能搞定:
# 先确认你的数据框df已经创建好 df <- data.frame(c(11:15,4:7,21:24), c(rep("A",9),rep("B",4)), c(rep("X",5),rep("Y",4),rep("X",4))) colnames(df) <- c("pos","name","name2") # 分组聚合计算min和max df_new <- aggregate(pos ~ name + name2, data = df, FUN = function(x) c(min = min(x), max = max(x))) # 将聚合后的列表列展开为普通数据框 df_new <- do.call(data.frame, df_new) # 查看结果 print(df_new)
运行后你会得到完全符合要求的df_new,aggregate会自动按name和name2的唯一组合分组,自定义函数返回的min和max会被整理成单独的列。
方法二:使用dplyr包(tidyverse工具链)
如果你平时习惯用tidyverse的语法,这种方式更直观易读:
# 先安装并加载dplyr(如果没安装过的话) # install.packages("dplyr") library(dplyr) df_new <- df %>% # 按name和name2分组 group_by(name, name2) %>% # 计算每组的pos最小值和最大值 summarise( pos_min = min(pos), pos_max = max(pos), .groups = "drop" # 计算完成后取消分组状态,返回普通数据框 ) # 查看结果 print(df_new)
这种链式语法逻辑清晰,后续如果需要添加更多统计量也很方便。
两种方法最终生成的df_new都会和你想要的格式完全一致:
name name2 pos_min pos_max 1 A X 11 15 2 B X 21 24 3 A Y 4 7
内容的提问来源于stack exchange,提问作者user1987607
相关产品推荐
相关产品推荐

