【问题标题】:Resample with replacement by group按组替换重采样
【发布时间】:2014-08-19 02:13:31
【问题描述】:

这是我的第一篇文章,所以请多多包涵。下面是我的数据的一个小样本。我的实际数据集有超过 4,000 个单独的 ID,每个 ID 可以分配从一到两百美元不等的单独金额。

ID   Dollars
001  17000
001  18000
001  23000
002  64000
002  31000
003  96000
003  164000
003  76000

我主要尝试做的事最好用一个例子来解释。我想为每个 ID 生成五个带有替换的随机样本。每个样本的大小为 5 或 5 个随机抽样的美元值。我的最终结果将有 20,000 个单独的样本(5 个样本,每 4000 个 ID,每个包含 5 个按 ID 随机选择的美元金额)。我这样做是为了将每个样本中的美元分布与具有相同 ID 的其他样本进行比较。

截至目前,我正在尝试使用下面引用的代码来获得这样的答案。我还应该指出,当我运行这个脚本时,我收到一个错误,我的“结果必须全部是原子的”。我不确定是否需要添加其他步骤或什么。

x <- function(func)
     {
      func<-(lapply(1:5, function(i)
        sample(data$Dollars, size=5, replace=TRUE)))
     }
     grouped.samples<-ddply(data,.variables="ID",.fun=x)

如果我提出的问题不清楚,我很抱歉;我很难说出我遇到的问题。

提前感谢您的帮助

【问题讨论】:

    标签: r random-sample sample-data


    【解决方案1】:

    我会尝试这样的:

    cbind(rep(unique(d$ID), each=5), 
          unlist(tapply(d$Dollars, d$ID, FUN=sample, size=5, replace=TRUE)))
       [,1]   [,2]
    11    1  18000
    12    1  17000
    13    1  18000
    14    1  17000
    15    1  17000
    21    2  31000
    22    2  31000
    23    2  64000
    24    2  64000
    25    2  64000
    31    3 164000
    32    3  96000
    33    3  96000
    34    3  76000
    35    3  96000
    

    【讨论】:

      【解决方案2】:

      试试这个。

      # create sample dataset...
      df <- data.frame(ID=rep(1:400,each=10),Dollars=1000*rpois(4000,5))
      
      # this does the work...
      result <- do.call(rbind,lapply(split(df,df$ID),function(x)x[sample(1:nrow(x),5, replace=T),]))
      

      【讨论】:

        【解决方案3】:

        使用data.table:

        library(data.table)
        dt = as.data.table(your_df)
        
        dt[, Dollars[sample.int(.N, 5, TRUE)], by = ID]
        #    ID     V1
        # 1:  1  17000
        # 2:  1  18000
        # 3:  1  18000
        # 4:  1  23000
        # 5:  1  17000
        # 6:  2  31000
        # 7:  2  31000
        # 8:  2  31000
        # 9:  2  31000
        #10:  2  64000
        #11:  3  96000
        #12:  3  96000
        #13:  3  76000
        #14:  3 164000
        #15:  3  76000
        

        【讨论】:

        • 这无疑是最快的解决方案,尤其是。有 4000 个 ID。
        • 感谢您的帮助@eddi。当我运行使用示例函数的代码的第二部分时,我收到以下错误:“第 2 组结果的第 1 列是“双”类型,但需要“整数”类型。每个组的列类型必须一致。'
        • @YimYames 这是因为sample 在给定单个数字时的行为方式 - 请参阅?sample 并使用resample 函数代替那里的示例;修改答案以做到这一点
        • 再次感谢@eddi 的帮助,非常感谢。然而,我还有一个问题。根据您在上面提供的示例输出(来自您的脚本),是否可以生成包含列 V2、V3、V4 和 V5 的输出?同样,每一列都是每个 ID 的另一个美元样本。
        • @YimYames 再次采样,例如dt[, list(Dollars[sample.int(.N, 5, T)], Dollars[sample.int(.N, 5, T)]), by = ID]
        【解决方案4】:

        如果我理解了问题,这可能就足够了:

        sapply(unique(data$ID), function(x) sample(data$Dollars, 5, replace=T))
        

        【讨论】:

          【解决方案5】:

          我想我会添加一个dplyr 解决方案,使用sample_n,就像this question 的答案之一一样。

          require(dplyr)
          dat1 %>%
              group_by(ID) %>%
              do(sample_n(., 5, replace = TRUE))
          

          编辑:

          在查看更多sample_n 的帮助后,我意识到sample_n 函数应该直接在组内工作(因此,没有do)。目前没有,这是已知的issue

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-18
            • 1970-01-01
            • 2018-04-11
            相关资源
            最近更新 更多