使用pmap()计算多列的行方式

时间:2018-05-08 18:58:01

标签: r purrr pmap

我正在努力更好地了解pmap()在数据框架中的工作原理,并且在将pmap()应用于来自多个列的计算方法时,我得到了令人惊讶的结果。

mtcars %>% 
  mutate(comp_var = pmap_dbl(list(vs, am, cyl), mean)) %>% 
  select(comp_var, vs, am, cyl)

在上面的例子中,comp_var等于其行中vs的值,而不是给定行中三个变量的平均值。

我知道我可以使用... {/ 1>获得comp_var的准确结果

mtcars %>% 
  rowwise() %>% 
    mutate(comp_var = mean(c(vs, am, cyl))) %>% 
    select(comp_var, vs, am, cyl) %>% 
  ungroup()

...但我想了解在这种情况下如何应用pmap()

1 个答案:

答案 0 :(得分:5)

我们需要将xmean参数的参数连接为

  

x:一个R对象。目前有数字/逻辑方法             矢量和日期,日期时间和时间间隔对象。             复数向量仅允许'trim = 0'。

因此,如果我们传递x1,x2,x3等参数,它将根据用法进入...参数

  

mean(x,...)

例如

mean(5, 8) # x is 5
#[1] 5 
mean(8, 5) # x is 8
#[1] 8
mean(c(5, 8)) # x is a vector with 2 values
#[1] 6.5

rowwise函数中,OP将元素连接到单个向量,而pmap将其保留为mean以应用于第一个参数

out1 <- mtcars %>% 
         mutate(comp_var = pmap_dbl(list(vs, am, cyl), ~mean(c(...)))) %>% 
         dplyr::select(comp_var, vs, am, cyl)

- 使用rowwise输出

进行检查
out2 <- mtcars %>% 
         rowwise() %>% 
         mutate(comp_var = mean(c(vs, am, cyl))) %>% 
         dplyr::select(comp_var, vs, am, cyl) %>% 
         ungroup()

all.equal(out1, out2, check.attributes = FALSE)
#[1] TRUE