3

这是我的第一篇文章,所以请多多包涵。下面是我的数据的一个小样本。我的实际数据集有超过 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)

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

在此先感谢您的帮助

4

5 回答 5

5

Using 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
于 2014-06-27T21:20:00.500 回答
4

我想我会添加一个dplyr解决方案,sample_n就像在这个问题的答案之一中使用一样。

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

编辑:

在查看sample_n更多帮助后,我意识到该sample_n功能应该直接在组内工作(因此,没有do)。目前没有,这是一个已知问题

于 2014-06-27T21:38:39.963 回答
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
于 2014-06-27T21:13:29.840 回答
0

Try this.

# 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),]))
于 2014-06-27T21:19:53.723 回答
0

Maybe this could be enough if I have understand the problem :

sapply(unique(data$ID), function(x) sample(data$Dollars, 5, replace=T))
于 2014-06-27T21:29:02.383 回答