【发布时间】:2019-05-20 05:18:03
【问题描述】:
我将tidyr::nest() 与purrr::map() (-family) 结合使用,将data.frame 分组,然后对每个子集做一些花哨的事情。考虑以下示例,请忽略我不需要 nest() 和 map() 来执行此操作(这是一个过于简单的示例):
library(dplyr)
library(purrr)
library(tidyr)
mtcars %>%
group_by(cyl) %>%
nest() %>%
mutate(
wt_mean = map_dbl(data,~mean(.x$wt))
)
# A tibble: 8 x 4
cyl gear data cly2
<dbl> <dbl> <list> <dbl>
1 6 4 <tibble [4 x 9]> 6
2 4 4 <tibble [8 x 9]> 4
3 6 3 <tibble [2 x 9]> 6
4 8 3 <tibble [12 x 9]> 8
5 4 3 <tibble [1 x 9]> 4
6 4 5 <tibble [2 x 9]> 4
7 8 5 <tibble [2 x 9]> 8
8 6 5 <tibble [1 x 9]> 6
通常当我执行此类操作时,我需要访问map() 中的分组变量(在本例中为cyl)。但是这些分组变量显示为长度与嵌套数据帧中的行数相对应的向量,因此并不容易使用。
有没有办法可以运行以下操作?我希望将wt 的平均值除以每组(即行)的柱面数(cyl)。
mtcars %>%
group_by(cyl,gear) %>%
nest() %>%
mutate(
wt_mean = map_dbl(data,~mean(.x$wt)/cyl)
)
Error in mutate_impl(.data, dots) :
Evaluation error: Result 1 is not a length 1 atomic vector.
【问题讨论】:
-
当您使用
map而不是map_dbl时会得到什么?我通常从裸map开始进行调试。当map_dbl的每次迭代都没有产生单个数值时,就会出现该错误