3

我发现以下工作

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' .
4

2 回答 2

3

代码看起来可以正常工作,但如果你unnest这样做,你实际上只是得到了很多NAs 因为你试图获取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
于 2017-12-19T01:23:04.377 回答
0

更新的语法是:

iris %>% 
    select(Sepal.Length) %>% 
    modelr::bootstrap(100) %>% 
    mutate(stats = map(strap, ~summarise_all(as_tibble(.x), list(mean = mean, median = median)))) %>% 
    unnest(stats)

因为as_data_frame并且funs已被弃用

于 2021-11-11T12:05:19.120 回答