You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 15:10:16