重新格式化数据以汇总行并将行折叠到简单的表格中

问题描述 投票:0回答:1

我有一个看起来像这样的数据集:

名字 派对 喜欢 转发
汤姆 R 1 2016 1357 23
戴夫 R 1 2016 1881 34
拉里 D 1 2016 324 45
蒂姆 D 1 2016 5587 56
罗布 R 1 2016 9847 67
山姆 D 1 2016 4466 78
汤姆 R 1 2017 ### ##
戴夫 R 1 2017 ### ##
拉里 D 1 2017 ### ##
蒂姆 D 1 2017 ### ##
罗布 R 1 2017 ### ##
山姆 D 1 2017 ### ##
汤姆 R 1 2018 ### ##
戴夫 R 1 2018 ### ##
拉里 D 1 2018 ### ##
蒂姆 D 1 2018 ### ##
罗布 R 1 2018 ### ##
山姆 D 1 2018 ### ##

我有几列想要折叠和求和,这样我就可以得到一个长数据集的更简单的输出。我你会注意到有一堆“###”符号,但这只是因为我认为没有必要添加额外的信息,因为我相信我提供的内容足以解决我的问题。

但我想重新格式化数据,这样更容易创建绘图。基本上,我想要下面的变量。因此,我希望第一列是年份(数据集中每年一行)。第二列应该是折叠以创建该行的行的总和(我在表 1 中创建了“count”变量,以便可以对行值求和。)然后我需要四个新列,每个列代表总和那一年民主党和共和党的点赞和转发次数。它应该看起来像这样:

喜欢共和党人 喜欢_民主党 转发_共和党人 转发_民主党
2016 6 13085 10377 124 179
2017 6 ### ### ### ###
2018 6 ### ### ### ###

我觉得 dplyr 中有一个简单的命令可以解决此类问题,但我不记得它是什么,而且我觉得我真的很难理解它及其工作原理。任何帮助将不胜感激。

r dataframe dplyr data-wrangling summarize
1个回答
0
投票

以下解决方案应适用于

dplyr
tidyr

值得用缺失数据和其他边缘情况来测试这一点,例如其他政党的选民。

library(dplyr)
library(tidyr) #Allows pivot_wider

# Create a minimal reprex
data = tibble(name = c("Tom","Dave","Larry","Tim","Rob","Sam"),
              party = c("R", "R", "D", "D", "R", "D"),
              count = rep(1, 6),
              year = c(rep(2016, 3), rep(2017, 3)),
              likes = c(1357, 1881, 324, 5587, 9847, 4466),
              retweet = c(23, 34, 45, 56, 67, 78))

# Create the likes data using summarise and group_by before pivot_wider
likes_data = data %>% 
  mutate(party = case_when(
    party == "D" ~ "democrats",
    party == "R" ~ "republicans"
  )) %>% 
  group_by(year) %>% 
  mutate(count = n()) %>% 
  group_by(year, count, party) %>% 
  summarise(likes = sum(likes, na.rm = TRUE)) %>% 
  ungroup() %>%
  pivot_wider(names_from = "party",
              names_prefix = "likes_",
              values_from = c(likes))
 
  
# Create the retweets data using summarise and group_by before pivot_wider
retweets_data = data %>% 
  mutate(party = case_when(
    party == "D" ~ "democrats",
    party == "R" ~ "republicans"
  )) %>% 
  group_by(year) %>% 
  mutate(count = n()) %>% 
  group_by(year, count, party) %>% 
  summarise(retweets = sum(retweet, na.rm = TRUE)) %>% 
  ungroup() %>%
  pivot_wider(names_from = "party",
              names_prefix = "retweets_",
              values_from = c(retweets))


# Join the data
summary_data = left_join(likes_data, retweets_data)
summary_data

Joining with `by = join_by(year, count)`
# A tibble: 2 × 6
   year count likes_democrats likes_republicans retweets_democrats retweets_republicans
  <dbl> <int>           <dbl>             <dbl>              <dbl>                <dbl>
1  2016     3             324              3238                 45                   57
2  2017     3           10053              9847                134                   67
© www.soinside.com 2019 - 2024. All rights reserved.