我是R的新手,我正在尝试创建一个不同大小的群组的自举重新采样的新数据框。我的数据帧有6个变量和一个组名称,有128组不同的N.以下是我的数据示例:
head(PhenoM2)
ID Name PhenoNames Group HML RML FML TML FHD BIB
1 378607 PaleoAleut PaleoAleut 1 323.5 248.75 434.50 355.75 46.84 NA
2 378664 PaleoAleut PaleoAleut 1 NA 238.50 441.50 353.00 45.83 277.0
3 378377 PaleoAleut PaleoAleut 1 309.5 227.75 419.00 332.25 46.39 284.0
4 378463 PaleoAleut PaleoAleut 1 283.5 228.75 397.75 331.00 44.37 255.5
5 378602 PaleoAleut PaleoAleut 1 279.5 230.00 393.00 329.50 45.93 265.0
6 378610 PaleoAleut PaleoAleut 1 307.5 234.25 419.50 338.50 43.98 271.5
从这个问题中提取 - bootstrap resampling for hierarchical/multilevel data - 并从别人那里得到一些建议(谢谢!)我写了代码:
resample.M <- NULL
for(i in 1000){
groups <- unique(PhenoM2$"Group")
for(ii in 1:128)
data.i.ii <- PhenoM2[PhenoM2$"Group"==groups[ii],]
resample.M[i] <- data.i.ii[sample(1:nrow(data.i.ii),replace=T),]
}
不幸的是,这给了我警告:
In resample.M[i] <- data.i.ii[sample(1:nrow(data.i.ii), replace = T),:
number of items to replace is not a multiple of replacement length
我理解,因为128个组中的每个组都有不同的N,并且没有它是1000的倍数。我放入resample.M [i]尝试将128个组中的所有1000x重采样累积到一个数据库,我很确定这个问题就在这里。
几乎所有我读过的for循环的例子都创建了一个矢量数据库 - 数字(1000) - 然后插入信息,但由于我想要所有的数据(包括因素,整数和数字)这不起作用。我尝试制作一个矩阵来放入信息(数据框中有2187个独特个体):
resample.M <- matrix(ncol=2187000,nrow=10)
但它给了我同样的警告。
所以,既然我确定我错过了一些基本的东西,我有三个问题:
如何让此代码重新取样所有组(替换并基于其各自的N)?
如何让此代码重复此重采样1000x?
如何将每个组的重新采样放到同一个数据库中?
非常感谢您的见解和专业知识!
答案 0 :(得分:0)
我想您可能想要使用双方括号,将结果存储在列表中,即resample.M[[i]] <- ...
。除此之外,写PhenoM2$Group
比PhenoM2$"Group"
和groups <- unique(PhenoM2$Group)
更有意义可以超出for
循环,因为您只需要计算一次。同时将1:128
替换为1:length(groups)
或seq_along(groups)
,这样您就不需要对矢量的长度进行硬编码。
因为你经常需要操作按某个变量分组的数据帧,所以我建议你熟悉一个专门用来做这个的包,而不是使用for
循环,这可能非常慢。对于R中的初学者来说,最好的一个可能是plyr
,它有一个简单的语法(虽然有很多可能性,包括稍微多一些&#34;高级&#34;像dplyr
和{{ 1}})。
因此,对于子集data.table
,您已经拥有了需要执行的功能:d <- subset(PhenoM2, Group == 1)
。
现在回顾所有这些子集,执行此操作,然后将结果排列在名为function(d) d[sample(1:nrow(d), replace = TRUE),]
的新数据框中
samples
剩下的就是迭代1000或者你想要的次数。您可以使用samples <- ddply(PhenoM2, .(Group),
function(d) d[sample(1:nrow(d), replace = TRUE),])
循环,将结果存储在for
中。请注意,您需要使用双方括号list
来设置列表的元素。
[[
另一种方法是使用多次执行相同任务的函数n <- 1000 # number of iterations
samples <- vector("list", n) # list of length n to store results
for (i in seq_along(samples))
samples[[i]] <- ddply(PhenoM2, .(Group),
function(d) d[sample(1:nrow(d), replace = TRUE),])
。
完成此操作后,所有重新采样都将存储在列表中。我不确定你的意思&#34;我怎样才能将每个组的重新采样放到同一个数据库中?#34;。如果要将它们分组到一个数据框中,则执行replicate
。通常,您可以使用all.samples <- do.call(rbind, samples)
和do.call
以及函数格式化样本列表。