我发现以下作品
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(mean = map(strap, mean))
但下面没有
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(median = map(strap, median))
唯一的区别是第二行代码使用中位数。
我得到的错误是
Error in mutate_impl(.data, dots) : Evaluation error: unimplemented type 'list' in 'greater' .
答案 0 :(得分:3)
代码看起来很有效,但是如果你unnest
它,你实际上只是获得了很多NA
因为你正试图采取mean
对象的resample
,它是一个分类列表,其中包含对重采样数据的引用以及特定重采样的索引。取这样一个列表的平均值是没用的,所以返回NA
警告是有用的行为。要使代码生效,请将重新采样强制转换为数据框,您可以在map
的匿名函数中照常操作。
对于直接路线,提取数据并取均值,将列表简化为map_dbl
的数字向量:
library(tidyverse)
set.seed(47)
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(sepal_mean = map_dbl(strap, ~mean(as_data_frame(.x)$Sepal.Length)))
#> # A tibble: 100 x 3
#> strap .id sepal_mean
#> <list> <chr> <dbl>
#> 1 <S3: resample> 001 5.844000
#> 2 <S3: resample> 002 6.016000
#> 3 <S3: resample> 003 5.851333
#> 4 <S3: resample> 004 5.869333
#> 5 <S3: resample> 005 5.840667
#> 6 <S3: resample> 006 5.825333
#> 7 <S3: resample> 007 5.824000
#> 8 <S3: resample> 008 5.790000
#> 9 <S3: resample> 009 5.858000
#> 10 <S3: resample> 010 5.810000
#> # ... with 90 more rows
将此方法翻译为median
可以正常工作:
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(sepal_median = map_dbl(strap, ~median(as_data_frame(.x)$Sepal.Length)))
#> # A tibble: 100 x 3
#> strap .id sepal_median
#> <list> <chr> <dbl>
#> 1 <S3: resample> 001 5.9
#> 2 <S3: resample> 002 5.8
#> 3 <S3: resample> 003 5.8
#> 4 <S3: resample> 004 5.7
#> 5 <S3: resample> 005 5.7
#> 6 <S3: resample> 006 5.8
#> 7 <S3: resample> 007 5.8
#> 8 <S3: resample> 008 5.7
#> 9 <S3: resample> 009 5.8
#> 10 <S3: resample> 010 5.7
#> # ... with 90 more rows
如果您同时使用中位数和均值,则可以重复强制重采样到数据框,或将其存储在另一列中,但这两种方法都不是很有效。最好返回map
可以unnest
编辑的数据框列表:
iris %>%
select(Sepal.Length) %>%
modelr::bootstrap(100) %>%
mutate(stats = map(strap, ~summarise_all(as_data_frame(.x), funs(mean, median)))) %>%
unnest(stats)
#> # A tibble: 100 x 4
#> strap .id mean median
#> <list> <chr> <dbl> <dbl>
#> 1 <S3: resample> 001 5.744667 5.60
#> 2 <S3: resample> 002 5.725333 5.70
#> 3 <S3: resample> 003 5.808667 5.70
#> 4 <S3: resample> 004 5.809333 5.70
#> 5 <S3: resample> 005 5.964000 5.85
#> 6 <S3: resample> 006 5.931333 5.95
#> 7 <S3: resample> 007 5.838667 5.80
#> 8 <S3: resample> 008 5.926000 5.95
#> 9 <S3: resample> 009 5.855333 5.75
#> 10 <S3: resample> 010 5.888667 5.70
#> # ... with 90 more rows