【问题标题】:pmap not mapping across rows of dataframepmap 没有跨数据框的行映射
【发布时间】:2018-07-17 01:36:41
【问题描述】:

我正在尝试将一个函数映射到包含在 使用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 package (v0.2.0) 于 2018 年 7 月 16 日创建。

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

谁能告诉我如何纠正这个问题?我不完全 了解如何从文档中应用pmap

【问题讨论】:

  • pmap 工作时为什么要使用pmap?我不确定这是否是使用pmap 的正确示例。
  • 谢谢。在这种简单的情况下,您的建议将起作用,因为我们只是返回一个可以通过mutate 放置在新列中的数字。尽管如果您将new_ratio 替换为返回一个大列表(对于每个输出)的更复杂的函数,那么 pmap 就是我想要做的。此处创建的df 以干净的方式在我的实际用例中创建了每个输入组合。将我的函数映射到每一行(即输入组合)并得到一个单独的列表会很棒,因此请求pmap

标签: r tidyverse purrr


【解决方案1】:

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

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

【讨论】:

  • 谢谢。这就是我一直在寻找的。我很接近,但输入传递到pmap 的方式并不那么明显。感谢您的澄清。我觉得选项 1 是最简洁的方式,即以正确的顺序排列名称。
猜你喜欢
  • 2018-11-28
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 2010-12-17
  • 2021-09-29
  • 2022-11-18
相关资源
最近更新 更多