如何对指定列按行求和后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
相关产品推荐
相关产品推荐

