【发布时间】:2019-01-29 09:08:32
【问题描述】:
拿这个简单的数据集和函数(代表更复杂的问题):
x <- data.frame(a = 1:3, b = 2:4)
mult <- function(a,b,n) (a + b) * n
使用基本 R 的 Map 我可以这样做以矢量化方式添加 2 个新列:
ns <- 1:2
x[paste0("new",seq_along(ns))] <- Map(mult, x["a"], x["b"], n=ns)
x
# a b new1 new2
#1 1 2 3 6
#2 2 3 5 10
#3 3 4 7 14
purrr尝试通过pmap得到一个列表输出:
library(purrr)
library(dplyr)
x %>% select(a,b) %>% pmap(mult, n=1:2)
#[[1]]
#[1] 3 6
#
#[[2]]
#[1] 5 10
#
#[[3]]
#[1] 7 14
我从这里尝试使用 pmap_dfr 等似乎都在尝试将其映射回新列时出错。
我如何最终制作 2 个与我当前的 "new1"/"new2" 匹配的变量?我确定有一个简单的咒语,但我显然忽略了它或使用了错误的*map* 函数。
这里有一些有用的讨论 - How to use map from purrr with dplyr::mutate to create multiple new columns based on column pairs - 但对于我想象的一个简单问题来说,它似乎过于老套和不灵活。
【问题讨论】:
-
这很难看,但我不认为你在找这个。
x %>% select(a,b) %>% pmap(mult, n=1:2) %>% bind_cols() %>% t() -
这个呢:
x[paste0("new",seq_along(ns))] <- pmap(list(x['a'], x['b'], ns), mult)? -
@mt1022 - 这是一个非常好的观点,
pmap/Map直接类似。唯一的问题是我试图将它融入其他人的管道代码。有没有办法像(非工作)x %>% pmap(list(a,b,ns), mult)一样将x输入到pmap- 我在这个阶段仍然迷路。 -
我想不出更好的方法来将
a和b从x提供给pmap。我得到的最接近的是x %>% {list(.['a'], .['b'], ns)} %>% pmap(mult) %>% setNames(paste0('new', seq_along(ns))) %>% cbind(x)。 -
@mt1022 - 这还不错。为了完成,可能值得添加作为正式答案。