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