purrr::map与dplyr::do等价

4

阅读https://twitter.com/hadleywickham/status/719542847045636096后,我理解 purrr 的方法基本上应该替代 do

因此,我想知道如何使用 purrr 来做到这一点:

library(dplyr)
d <- data_frame(n = 1:3)
d %>% rowwise() %>% do(data_frame(x = seq_len(.$n))) %>% ungroup()
# # tibble [6 x 1]
#       x
# * <int>
# 1     1
# 2     1
# 3     2
# 4     1
# 5     2
# 6     3

我能找到的最接近的翻译是:

我能找到的最接近的东西是这样的:

library(purrrr)
d %>% mutate(x = map(n, seq_len))
# # A tibble: 3 x 2
#       n         x
#   <int>    <list>
# 1     1 <int [1]>
# 2     2 <int [2]>
# 3     3 <int [3]>

map_int不能使用。那么,purrrr的做法是什么?


1
我认为你需要在链的末尾使用 tidyr::unnest。我不知道这是否是“purrr方式”,但这是一种方法。 - aosmith
2个回答

6
您可以按照以下步骤操作:
library(tidyverse)
library(purrr)
d %>% by_row(~data_frame(x = seq_len(.$n))) %>% unnest()

by_row应用于每一行,将结果存储在嵌套的tibble中。unnest用于去除嵌套并连接tibbles。


3
附注:by_row似乎已经被移动到了包purrrlyr中。 - lukeA

1
使用pmap()可以避免嵌套和拆分的需要。
library(tidyverse)
d %>% pmap_df(~data_frame(x = seq_len(.)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接