假设我有这张桌子:
week_number;day_of_week;amount
26;Monday;100
26;Tuesday;50
26;Wednesday;90
27;Monday;50
27;Tuesday;10
27;Wednesday;40
我想使用dplyr将其转换为以下内容:
week_number;Monday;Tuesday;Wednesday
26;100;50;90
27;50;10;40
我知道如何按week_number和day_of_week分组,并获取每个总数。但是我每天都需要单独的列。
谢谢
p.d:我目前使用的解决方法依赖于重塑,如下所示,但是我不敢相信使用dplyr不能完成相同的工作:
library(reshape)
unpivoted_data_frame <- melt(dataframe, id=c("week_number", "day_of_week"))
final_data_frame <- cast(unpivoted_data_frame, week_number ~ day_of_week, sum)
答案 0 :(得分:1)
使用tidyverse
,我们可以按组创建序列列,然后执行spread
library(dplyr)
library(tidyr)
df1 %>%
group_by(day_of_week) %>%
mutate(rn = row_number()) %>%
spread(day_of_week, amount) %>%
select(-rn)
# A tibble: 2 x 4
# week_number Monday Tuesday Wednesday
# <int> <int> <int> <int>
#1 26 100 50 90
#2 27 50 10 40
答案 1 :(得分:1)
是否有必要仅使用dplyr
中的函数?这是使用spread
中的tidyr
函数的解决方案。
library(tidyverse)
dat2 <- dat %>%
spread(day_of_week, amount)
dat2
# # A tibble: 2 x 4
# week_number Monday Tuesday Wednesday
# <dbl> <dbl> <dbl> <dbl>
# 1 26 100 50 90
# 2 27 50 10 40
数据
dat <- tribble(
~week_number, ~day_of_week, ~amount,
26, "Monday", 100,
26, "Tuesday", 50,
26, "Wednesday", 90,
27, "Monday", 50,
27, "Tuesday", 10,
27, "Wednesday", 40
)