首页 > 解决方案 > pmap 没有跨数据框的行映射

问题描述

我正在尝试使用purrr::pmap. 我有reprex 以下内容:

library(tidyverse)

# Create dummy data
e <- 0.3
f <- 1:3
g <- 1:3
df <- tidyr::crossing(e = e, f = f, g = g)

# Create a simple function to use
new_ratio <- function(x, y, z){
    return(x/(y + z))
}

# Apply pmap across rows of the dataframe `df` - not working as intended 
purrr::pmap(df, ~ new_ratio(x = e, y = f, z = g))
#> [[1]]
#> [1] 0.150 0.075 0.050
#> 
#> [[2]]
#> [1] 0.150 0.075 0.050
#> 
#> [[3]]
#> [1] 0.150 0.075 0.050
#> 
#> [[4]]
#> [1] 0.150 0.075 0.050
#> 
#> [[5]]
#> [1] 0.150 0.075 0.050
#> 
#> [[6]]
#> [1] 0.150 0.075 0.050
#> 
#> [[7]]
#> [1] 0.150 0.075 0.050
#> 
#> [[8]]
#> [1] 0.150 0.075 0.050
#> 
#> [[9]]
#> [1] 0.150 0.075 0.050

reprex 包(v0.2.0)于 2018 年 7 月 16 日创建。

可以看出,我真的很想 逐行创建一个简单的输出来给出这个简单示例中的比率e/(f+g)。该函数不断为不同的输入返回相同的值。在第一行中,我期望输出0.3/(1 + 1) = 0.15,在第二行中期望 0.3/(1 + 2) = 0.1等等

任何人都可以请展示如何纠正这个吗?我不太了解如何pmap从文档中申请

标签: rtidyversepurrr

解决方案


我们可以将列名更改为参数名,它应该可以工作

pmap_dbl(setNames(df, c('x', 'y', 'z')), new_ratio)
#[1] 0.150 0.100 0.075 0.100 0.075 0.060 0.075 0.060 0.050

或者如果我们打算使用~,参数..后跟数字

pmap_dbl(df, ~ new_ratio(x = ..1, y= ..2, z = ..3))
#[1] 0.150 0.100 0.075 0.100 0.075 0.060 0.075 0.060 0.050

推荐阅读