For循环中的循环?在R

时间:2014-07-01 01:44:28

标签: r loops

我是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?

如何将每个组的重新采样放到同一个数据库中?

非常感谢您的见解和专业知识!

1 个答案:

答案 0 :(得分:0)

我想您可能想要使用双方括号,将结果存储在列表中,即resample.M[[i]] <- ...。除此之外,写PhenoM2$GroupPhenoM2$"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以及函数格式化样本列表。