使用dplyr';要执行引导复制,请执行以下操作

使用dplyr';要执行引导复制,请执行以下操作,r,dplyr,R,Dplyr,我感兴趣的是使用dplyr构建引导复制(重复分析,其中每次都首先对数据进行替换采样)。Hadley Wickham提供了一些代码,用于以有效的方式重复引导分析: bootstrap <- function(df, m) { n <- nrow(df) attr(df, "indices") <- replicate(m, sample(n, replace = TRUE), simplify = FALSE) attr(df, "drop") <-

我感兴趣的是使用dplyr构建引导复制(重复分析,其中每次都首先对数据进行替换采样)。Hadley Wickham提供了一些代码,用于以有效的方式重复引导分析:

bootstrap <- function(df, m) {
  n <- nrow(df)

  attr(df, "indices") <- replicate(m, sample(n, replace = TRUE), 
    simplify = FALSE)
  attr(df, "drop") <- TRUE
  attr(df, "group_sizes") <- rep(n, m)
  attr(df, "biggest_group_size") <- n
  attr(df, "labels") <- data.frame(replicate = 1:m)
  attr(df, "vars") <- list(quote(boot)) # list(substitute(bootstrap(m)))
  class(df) <- c("grouped_df", "tbl_df", "tbl", "data.frame")

  df
}

library(dplyr)
mboot <- bootstrap(mtcars, 10)

# Works
mboot %.% summarise(mean(cyl))
追踪

11: stop(list(message = "index out of bounds", call = NULL, cppstack = NULL))
10: .Call("dplyr_grouped_df_impl", PACKAGE = "dplyr", data, symbols, 
        drop)
9: grouped_df_impl(data, unname(vars), drop)
8: grouped_df(cbind_list(labels, out), groups)
7: label_output_dataframe(labels, out, groups(.data))
6: do.grouped_df(`bootstrap(mtcars, 3)`, data.frame(x = 1:2))
5: do(`bootstrap(mtcars, 3)`, data.frame(x = 1:2))
4: eval(expr, envir, enclos)
3: eval(e, env)
2: withVisible(eval(e, env))
1: bootstrap(mtcars, 3) %>% do(data.frame(x = 1:2))
我能够通过执行两个
do
步骤和一组人员来解决这个问题:

bootstrap(mtcars, 10) %>% do(d=data.frame(x=1:2)) %>% group_by(replicate) %>% do(.$d[[1]])
但这似乎需要很多额外的、有点笨拙的步骤(同时也得到了一个警告,
按行分组数据帧带按行性质)。我还意识到,我可以先用以下方法将数据复制到十个副本中

data.frame(boot=1:10) %>% group_by(boot) %>% do(sample_n(mtcars, nrow(mtcars), replace=TRUE))
但是,如果数据或引导复制的数量很大,这在内存中是非常低效的


有没有一种方法,也许通过改变
引导设置功能,我可以用
引导(mtcars,3)%%>%do(data.frame(x=1:2))
执行这些复制?

我认为这是
引导设置功能中的一个小错误。
vars
属性应与
labels
属性中的
data.frame
中的列名匹配。但在函数中,
vars
属性称为
“boot”
,列名为
replicate
。所以,如果你做了这个小小的改变:

bootstrap <- function(df, m) {
  n <- nrow(df)

  attr(df, "indices") <- replicate(m, sample(n, replace = TRUE), 
                                   simplify = FALSE)
  attr(df, "drop") <- TRUE
  attr(df, "group_sizes") <- rep(n, m)
  attr(df, "biggest_group_size") <- n
  attr(df, "labels") <- data.frame(replicate = 1:m)
  attr(df, "vars") <- list(quote(replicate)) # Change
#  attr(df, "vars") <- list(quote(boot)) # list(substitute(bootstrap(m)))
  class(df) <- c("grouped_df", "tbl_df", "tbl", "data.frame")

  df
}
bootstrap <- function(df, m) {
  n <- nrow(df)

  attr(df, "indices") <- replicate(m, sample(n, replace = TRUE), 
                                   simplify = FALSE)
  attr(df, "drop") <- TRUE
  attr(df, "group_sizes") <- rep(n, m)
  attr(df, "biggest_group_size") <- n
  attr(df, "labels") <- data.frame(replicate = 1:m)
  attr(df, "vars") <- list(quote(replicate)) # Change
#  attr(df, "vars") <- list(quote(boot)) # list(substitute(bootstrap(m)))
  class(df) <- c("grouped_df", "tbl_df", "tbl", "data.frame")

  df
}
bootstrap(mtcars, 3) %>% do(data.frame(x=1:2))
# Source: local data frame [6 x 2]
# Groups: replicate

#   replicate x
# 1         1 1
# 2         1 2
# 3         2 1
# 4         2 2
# 5         3 1
# 6         3 2