重复使用地图提取嵌套数据失败

时间:2019-09-17 05:19:32

标签: r tidyverse purrr

我遇到了我不太理解的使用purrr的R脚本问题,希望这里的人能启发我。

这是一个例子:

library(tidyverse)

rep_raw <- tbl_df(iris) %>%
  group_by(Species) %>%
  nest() %>%
  mutate(values = map(data, "Sepal.Length"),
         mean = map(values, mean),
         mean_sepal = map(values, mean)) %>%
  glimpse

给我下面的输出

Observations: 3
Variables: 5
$ Species    <fct> setosa, versicolor, virginica
$ data       <list> [<tbl_df[50 x 4]>, <tbl_df[50 x 4]>, <tbl_df[50 x 4]>]
$ values     <list> [<5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.…
$ mean       <list> [5.006, 5.936, 6.588]
$ mean_sepal <list> [NULL, NULL, NULL]

为什么第一个计算“ mean”有效而第二个计算“ mean_sepal”给出NULL值?

我期望mean和mean_sepal相同。

1 个答案:

答案 0 :(得分:1)

mean_sepal计算不正确的原因是您存在范围问题。 mean通常会调用函数mean(),该函数将取平均值。但是,您通过命名新列mean陷入了困境。这迫使map选择引用向量mean或调用函数mean()

根据文档,可以将.f中的map自变量分配给“函数,公式或向量”,因此,mean向量是有效输入。

正如@RonakShah在评论中指出的,lapply没有相同的问题。我认为这是因为lapply要求FUN是一个函数(或数学符号),因此与map相比,向量mean对于{ {1}}。

我们在这里看到,如果将向量传递给FUN,则FUN将返回错误。

lapply
  

match.fun(FUN)中的错误:         'c(1、2、3)'不是函数,字符或符号