如何将S列相同的多行合并为单行并计算均值/中位数(R语言)
问题解决:R语言group_by+summarise后行数未减少的原因及修正
问题原因
你当前的代码在summarise步骤中直接保留了YB列,但没有对它做任何聚合计算(比如均值、中位数)。dplyr的summarise规则是:如果某列未用聚合函数处理,会保留该分组内的所有不同值,导致每个分组对应多行,无法实现“每个S对应一行”的需求。
修正方案
根据你对YB列的需求,有两种处理方式:
方式1:对YB列也进行聚合计算
如果需要保留YB的统计值(比如均值、中位数),给它加上聚合函数:
# 先加载dplyr包 library(dplyr) # 修正后的代码 data2 <- data1 %>% group_by(S) %>% summarize( MRn = median(Rn), APA = mean(P), AAA = mean(BA), AAL = mean(L), AYB = mean(YB) # 对YB取均值,也可以换成median(YB) ) %>% arrange(desc(MRn)) # 查看结果 data2
运行后每个S会对应一行,输出类似:
# A tibble: 2 × 6 S MRn APA AAA AAL AYB <chr> <dbl> <dbl> <dbl> <dbl> <dbl> 1 Balaclava 2 1115000 105 411 1930 2 Carnegie 2 697500 83 103 1989.5
方式2:不需要YB列则直接移除
如果绘图不需要YB数据,直接从summarise中去掉该列:
data2 <- data1 %>% group_by(S) %>% summarize( MRn = median(Rn), APA = mean(P), AAA = mean(BA), AAL = mean(L) ) %>% arrange(desc(MRn))
这样每个S只会生成一行数据,完全符合你的分组需求。
额外说明
如果你的分组中某些列是每个分组固定唯一值(比如示例中的D列,Balaclava都是6.6,Carnegie都是11.4),可以用first(D)或者last(D)来保留该值,确保每个分组只留一行:
data2 <- data1 %>% group_by(S) %>% summarize( MRn = median(Rn), APA = mean(P), AAA = mean(BA), AAL = mean(L), D = first(D) # 保留分组内的D值(因为每个分组D相同) ) %>% arrange(desc(MRn))
内容的提问来源于stack exchange,提问作者DariusMT7
相关产品推荐
相关产品推荐

