重新取样,按组替换

时间:2014-06-27 21:07:06

标签: r random-sample sample-data

这是我的第一篇文章,请耐心等待。以下是我的数据的一小部分样本。我的实际数据集有超过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,每个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)
如果我提出的问题不清楚,我会提前感到抱歉;我很难说出我遇到的问题。

提前感谢您的帮助

5 个答案:

答案 0 :(得分:5)

使用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

答案 1 :(得分:3)

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

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

编辑:

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

答案 2 :(得分:2)

我会尝试这样的事情:

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

答案 3 :(得分:0)

试试这个。

# 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),]))

答案 4 :(得分:0)

如果我理解了这个问题,也许这就足够了:

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