首页 > 解决方案 > 根据 data.frame 中的(组)值扩展 data.frame

问题描述

假设我有以下数据框:

tibble(user = c('A', 'B'), first = c(1,4), last = c(6, 9))
# A tibble: 2 x 3
  user  first  last
  <chr> <dbl> <dbl>
1 A         1     6
2 B         4     9

并想创建一个看起来像这样的小标题:

bind_rows(tibble(user = 'A', weeks = 1:6), 
          tibble(user = 'B', weeks = 4:9))
# A tibble: 12 x 2
   user  weeks
   <chr> <int>
 1 A         1
 2 A         2
 3 A         3
 4 A         4
 5 A         5
 6 A         6
 7 B         4
 8 B         5
 9 B         6
10 B         7
11 B         8
12 B         9

我怎么能这样做呢?我试过了:

tibble(user = c('A', 'B'), first = c(1,4), last = c(6, 9)) %>% 
group_by(user) %>% 
mutate(weeks = first:last)

我想知道我是否应该尝试组合complete mapor nest

标签: rdplyrtidyrpurrr

解决方案


一种选择是unnest在创建序列之后

library(dplyr)
library(purrr)
df1 %>% 
  transmute(user, weeks = map2(first, last, `:`)) %>%
  unnest(weeks)
# A tibble: 12 x 2
#   user  weeks
#   <chr> <int>
# 1 A         1
# 2 A         2
# 3 A         3
# 4 A         4
# 5 A         5
# 6 A         6
# 7 B         4
# 8 B         5
# 9 B         6
#10 B         7
#11 B         8
#12 B         9

或者另一种选择是rowwise

df1 %>% 
  rowwise %>%
  transmute(user, weeks = list(first:last)) %>% 
  unnest(weeks)

或者没有任何包裹

stack(setNames(Map(`:`, df1$first, df1$last), df1$user))

或以其他方式写成

stack(setNames(do.call(Map, c(f = `:`, df1[-1])), df1$user))

数据

df1 <- tibble(user = c('A', 'B'), first = c(1,4), last = c(6, 9))

推荐阅读