在R中使用dplyr分组求最大值时,如何获取对应列的正确取值?
问题原因
你原来的代码里,which.max(Column_B)返回的是分组内的行位置索引(比如每组里最大值在第1行还是第2行),但直接把这个索引值赋值给Corresponding_C,自然得到的是1、2这类数字,而不是对应的Column_C内容。
修正方法
这里提供几种实用的修正方式:
方法1:用slice_max(最直观)
dplyr的slice_max专门用来提取每组中指定列最大的N行,直接就能拿到对应行的所有信息:
library(dplyr) df_new <- df %>% group_by(Column_A) %>% # 取每组Column_B最大的1行,若有多个最大值可去掉with_ties=FALSE保留所有 slice_max(Column_B, n = 1, with_ties = FALSE) %>% # 重命名列到你需要的名称 rename(Max_B = Column_B, Corresponding_C = Column_C) %>% # 选择需要的列 select(Column_A, Max_B, Corresponding_C)
方法2:在summarise中通过索引取值
直接在summarise里用which.max得到的索引,去提取对应位置的Column_C值:
df_new <- df %>% group_by(Column_A) %>% summarise( Max_B = max(Column_B), # 用索引取出对应行的Column_C Corresponding_C = Column_C[which.max(Column_B)] )
方法3:用filter筛选最大值行
如果需要保留所有Column_B等于最大值的行(比如同一组有多个相同最大值时),可以用filter:
df_new <- df %>% group_by(Column_A) %>% filter(Column_B == max(Column_B)) %>% rename(Max_B = Column_B, Corresponding_C = Column_C) %>% select(Column_A, Max_B, Corresponding_C)
内容的提问来源于stack exchange,提问作者Britt Bay
相关产品推荐
相关产品推荐

