【问题标题】:Repeated use of map on extract of nested data fails在提取嵌套数据时重复使用地图失败
【发布时间】:2019-09-17 05:19:32
【问题描述】:

我在使用 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 相同。

【问题讨论】:

  • 这不只是一个范围界定问题吗?当您使用mean 作为列名时,map 认为您正在调用mean 列,而不是mean,函数。如果将mean 列重命名为mean2mean_sepal 计算正常。
  • 这意味着在您的代码中,mean 列计算得很好,因为没有冲突,但是对于 mean_sepal,您现在有一个名为 mean 的列,这会产生歧义。
  • @Mako212 的解释是有道理的,但也很奇怪,这不是 lapply 的问题,tbl_df(iris) %&gt;% group_by(Species) %&gt;% nest() %&gt;% mutate(values = map(data, "Sepal.Length"), mean = lapply(values, mean), mean2 = lapply(values, mean)) 为您提供了预期值。
  • 啊啊啊当然非常感谢@Mako212,这就解释了!
  • @RonakShah 我的猜测(没有深入研究文档/源代码)是由于tidyverse 支持不带引号的列名,以及map.f 参数将采用“函数、公式或向量”作为其值。相比之下,lapply 要求 FUN 是一个函数

标签: r tidyverse purrr


【解决方案1】:

mean_sepal 计算不正确的原因是您有范围问题。 mean 通常调用函数mean(),它取值的平均值。但是,您通过将新列命名为mean 已对此产生了影响。这迫使map 选择引用向量mean,或调用函数mean()

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

正如@RonakShah 在 cmets 中指出的那样,lapply 没有同样的问题。我相信这是因为lapply 要求FUN 是一个函数(或数学符号),因此与map 相比,向量mean 不是FUN 的有效值。

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

lapply(c(4,3), FUN = c(1,2,3))

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多