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

如何对指定列按行求和后rbind至同结构数据集(R语言)

数据集格式转换问题

原始数据集

Day|Population|Red|Yellow|Orange|Green
  1       30         15   3      4      8
  2       50         10   30     5      5
  3       10          3    6     1      0
  4       25          2   10    10      3

期望输出格式

Day|Color            |Population
  1  Green                 8
  1  Red,Orange,Yellow    22  
  2  Green                 5
  2  Red,Orange,Yellow    45
  3  Green                 0
  3  Red,Orange,Yellow    10 
  4  Green                 3
  4  Red,Orange,Yellow    22

尝试的错误代码

df<- rbind(
           summarise(df,Day,Population=df$Green,Color="Green"),
           summarise(df,Day,Population=sum(df$Red,df$Yellow,df$Orange),
           Color="Red,Orange,Yellow")) 

解决方案

你代码的问题在于误用了summarise函数——它的作用是对数据进行分组聚合,而你需要保留每行的Day并生成两条对应记录。以下是两种可行的正确实现方式:

方法一:构造分块后合并

library(dplyr)

# 生成Green对应的记录
green_df <- df %>%
  mutate(Population = Green, Color = "Green") %>%
  select(Day, Color, Population)

# 生成红、黄、橙三色总和对应的记录
other_df <- df %>%
  mutate(Population = Red + Yellow + Orange, Color = "Red,Orange,Yellow") %>%
  select(Day, Color, Population)

# 合并数据并按Day排序
result_df <- bind_rows(green_df, other_df) %>% arrange(Day)

方法二:用pivot_longer灵活转换(推荐,扩展性更强)

如果后续颜色类别有变动,这种方法不需要大幅修改代码:

library(dplyr)
library(tidyr)

result_df <- df %>%
  # 将颜色列转为长格式
  pivot_longer(cols = c(Red, Yellow, Orange, Green), 
               names_to = "Color", 
               values_to = "Count") %>%
  # 按Day和目标颜色组分组
  group_by(Day, Color = ifelse(Color == "Green", "Green", "Red,Orange,Yellow")) %>%
  # 计算每组人口总和
  summarise(Population = sum(Count), .groups = "drop") %>%
  # 按Day排序,确保Green记录排在每组前面
  arrange(Day, desc(Color))

运行任意一种方法后,result_df都会得到你期望的输出格式。

内容的提问来源于stack exchange,提问作者user35131

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:53:33