我有以下表格的数据
date data
<chr> <list>
1 2012-01-05 <tibble [796 x 5]>
2 2012-01-12 <tibble [831 x 5]>
3 2012-01-19 <tibble [820 x 5]>
... ...
我想使用与map()
类似的东西来计算平均值和标准偏差。
我目前可以单独使用以下内容,但可以同时计算两者。
mutate(stats = map(data, ~ sd(.$metric)))
mutate(stats = map(data, ~ mean(.$metric)))
另一种方法是创建一个类似summary
的函数,它返回四分位数和均值。但请改为计算mean
和sd
。那么我可以在map
中使用这个新函数,如下所示:
mutate(stats = map(data, ~ new_function(.$metric)))
有更好的选择吗?
答案 0 :(得分:1)
添加多个列的一个简单选项是,只需创建所需摘要统计信息的另一个列表列,然后unnest
:
library(tidyverse)
set.seed(47)
df <- data_frame(date = seq(as.Date('1970-01-01'), by = 1, length = 4),
data = map(date, ~data_frame(metric = rnorm(10))))
df
#> # A tibble: 4 x 2
#> date data
#> <date> <list>
#> 1 1970-01-01 <tibble [10 × 1]>
#> 2 1970-01-02 <tibble [10 × 1]>
#> 3 1970-01-03 <tibble [10 × 1]>
#> 4 1970-01-04 <tibble [10 × 1]>
df %>%
mutate(stats = map(data, ~data.frame(mean = mean(.x$metric),
sd = sd(.x$metric)))) %>%
unnest(stats)
#> # A tibble: 4 x 4
#> date data mean sd
#> <date> <list> <dbl> <dbl>
#> 1 1970-01-01 <tibble [10 × 1]> -0.106 0.992
#> 2 1970-01-02 <tibble [10 × 1]> -0.102 0.875
#> 3 1970-01-03 <tibble [10 × 1]> -0.833 0.979
#> 4 1970-01-04 <tibble [10 × 1]> 0.184 0.671
更具编程性的方法(可能更好地扩展)是在函数列表中的匿名函数内迭代。 lst
会自动为它们命名,因此结果将被命名,map_dfc
会将它们绑定到数据框中:
df %>%
mutate(stats = map(data,
~map_dfc(lst(mean, sd),
function(.fun) .fun(.x$metric)))) %>%
unnest(stats)
purrr有一个专门用于迭代函数/参数的函数,如:invoke_map
。如果您希望回收函数或参数,则它们必须位于长度为1的列表中。由于参数应该已经在列表中收集,因此它必须是嵌套列表。
df %>%
mutate(stats = map(data,
~invoke_map_dfc(lst(mean, sd),
list(list(.x$metric))))) %>%
unnest(stats)
所有方法都返回相同的东西。