我有一个看起来像这样的数据集:
名字 | 派对 | 数 | 年 | 喜欢 | 转发 |
---|---|---|---|---|---|
汤姆 | 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 中有一个简单的命令可以解决此类问题,但我不记得它是什么,而且我觉得我真的很难理解它及其工作原理。任何帮助将不胜感激。
以下解决方案应适用于
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