我遇到了我不太理解的使用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相同。
答案 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)'不是函数,字符或符号