r - 使用 purrr 和预定义函数添加多个输出变量

标签 r function purrr

拿这个简单的数据集和函数(代表更复杂的问题):

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 - 但对于我想象的一个简单问题来说,它似乎过于笨拙和不灵活。

最佳答案

这是一种可能性。

library(purrr)
library(dplyr)
n <- 1:2
x %>%
    mutate(val = pmap(., mult, n = n)) %>%
    unnest() %>%
    mutate(var = rep(paste0("new", n), nrow(.) / length(n))) %>%
    spread(var, val)
#  a b new1 new2
#1 1 2    3    6
#2 2 3    5   10
#3 3 4    7   14

不漂亮,所以我也很想看到替代品。很多多余来自unnest正在list列和 spread进入新列。

这是使用 pmap_dfc 的另一种可能性加上一个丑陋的as.data.frame(t(...))称呼
bind_cols(x, as.data.frame(t(pmap_dfc(x, mult, n = n))))
#  a b V1 V2
#1 1 2  3  6
#2 2 3  5 10
#3 3 4  7 14

样本数据
x <- data.frame(a = 1:3, b = 2:4)
mult <- function(a,b,n) (a + b) * n

关于r - 使用 purrr 和预定义函数添加多个输出变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51978138/

相关文章:

用2个函数计算

r - 在匿名函数内的公式中使用 quosures

r - 循环字符向量并使用元素作为 lambda 函数中的列名

R:滚动计算列值(避免循环)

r - 如何用列中最小值的一半替换零?

c - 将一个字符串复制到另一个字符串的程序(包含该函数)正在打印奇怪的字符

r - 从 apply/map 循环中提取重复索引

R Shiny : how to create a matrix with numericInput as elements

r - r中的集群表示树状图替代方案

r - 如何在R中更新软件包?