dplyr:如何按不同列中的单个变量取消分组

时间:2019-06-28 02:33:00

标签: r dplyr

假设我有这张桌子:

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)

2 个答案:

答案 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
)