r - 根据 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
map
or nest
?
解决方案
一种选择是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))
推荐阅读
- ripgrep - 使用 ripgrep 搜索单词的开头/结尾
- json - Angular 2如何动态绑定复选框并在单击提交按钮时返回选中的复选框ID
- generics - Kotlin 中的通用约束,这仅仅是一个方差问题吗?
- excel - 如何使用二维数组作为查找填充列(VBA)
- swift - UITableView 在 reloaddata 上滚动
- php - 循环遍历 PHP 中的数组以更新 MySQL 中的记录,但未获得所有结果
- html - 如何在选择标签上设置选择,而不是选项标签
- c# - 仅本地主机端点
- javascript - 即使文件已正确加载,在 jquery 中加载自定义文件也会返回错误
- c# - 如何将字符串从 PayPal 的 payment_date 转换为日期时间