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