【问题标题】:Combining the Output of "Replicates"结合“重复”的输出
【发布时间】:2023-01-30 00:51:23
【问题描述】:

我有以下功能:

fn <- function()
{ i = 1:100
v1 = rnorm(100,100,100)
v2 = rnorm(100,100,100)
out = data.frame(i, v1,v2)
return(out)
}

我的问题:我想使用 R 中的 replicate() 函数来运行此函数 100 次,并将所有 100 次运行的输出合并为一个输出(即 3 列,100x100 = 10000 行):

output = replicate(100, fn())

当我这样做时,数据以其他格式出现:

   [,1]        [,2]        [,3]        [,4]        [,5]        [,6]        [,7]       
i  integer,100 integer,100 integer,100 integer,100 integer,100 integer,100 integer,100
v1 numeric,100 numeric,100 numeric,100 numeric,100 numeric,100 numeric,100 numeric,100
v2 numeric,100 numeric,100 numeric,100 numeric,100 numeric,100 numeric,100 numeric,100

我知道我可以使用 FOR 循环执行完全相同的任务 - 但有什么方法可以使用 replicate() 函数执行此操作吗?

实际上,我有一个非常大的函数,我不想用“i”和“j”索引修改 - 我想也许我可以将 replicate() 放入循环本身?

my_list = list()

for ( i in 1:100)
{

out_i = replicate(fn(),1)
out_i$round = i
my_list[i] = out_i
}

final <- do.call(rbind.data.frame, my_list)

但是我不确定该怎么做-有人可以告诉我该怎么做吗?

谢谢!

注意:这是正确的吗?

my_list <- lapply(1:100, 函数(i) {

out_i <- my_function() 函数

out_i$round <- i out_i })

最后 <- do.call(rbind, my_list)

【问题讨论】:

    标签: r


    【解决方案1】:

    使用simplify=FALSE然后do.call(rbind, ..):

    ### does not work
    output <- replicate(2, mtcars[1:2,])
    output
    #      [,1]      [,2]     
    # mpg  numeric,2 numeric,2
    # cyl  numeric,2 numeric,2
    # disp numeric,2 numeric,2
    # hp   numeric,2 numeric,2
    # drat numeric,2 numeric,2
    # wt   numeric,2 numeric,2
    # qsec numeric,2 numeric,2
    # vs   numeric,2 numeric,2
    # am   numeric,2 numeric,2
    # gear numeric,2 numeric,2
    # carb numeric,2 numeric,2
    
    ### does work
    output <- replicate(2, mtcars[1:2,], simplify = FALSE)
    output
    # [[1]]
    #               mpg cyl disp  hp drat    wt  qsec vs am gear carb
    # Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
    # Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
    # [[2]]
    #               mpg cyl disp  hp drat    wt  qsec vs am gear carb
    # Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
    # Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
    output <- do.call(rbind, output)
    output
    #                mpg cyl disp  hp drat    wt  qsec vs am gear carb
    # Mazda RX4       21   6  160 110  3.9 2.620 16.46  0  1    4    4
    # Mazda RX4 Wag   21   6  160 110  3.9 2.875 17.02  0  1    4    4
    # Mazda RX41      21   6  160 110  3.9 2.620 16.46  0  1    4    4
    # Mazda RX4 Wag1  21   6  160 110  3.9 2.875 17.02  0  1    4    4
    

    【讨论】:

    • r2evans:谢谢你的回答!我也试图自己解决它(见下面的答案) - 这是正确的吗?太感谢了!
    • @stats_noob,你会发现replicate(100, expr, simplify=FALSE) 和lapply(1:100, function(ign) expr) 返回相同的对象。差异确实很小:(1) expression 不需要是replicate 中的函数,输入更少; (2) replicate 的使用更具声明性,向用户/读者/世界说明您打算做同样的事情 n-times without external variation,而 lapply(.., function(z) ...) 暗示您应该用z。虽然忽略z 完全没问题,但未来您可能会感谢您的透明度。
    • 旁注:如果你打算以编程方式/无人监督的方式执行此操作,还有一个区别:如果n=0,则replicate(.)和lapply(.)的结果将不同,因为1:n将返回一个长度为 2 的向量,与人们可能假设的相反。在这些情况下,您仍然可以使用 lapply 变体,但使用更安全的 lapply(seq_len(n), ..) 就可以了没有当n=0如你所愿; replicate(n,..) 在这种情况下也不会做任何事情(当然不需要 seq_len(n))。
    【解决方案2】:

    在问题中,它说“有什么办法可以用 replicate() 函数做到这一点吗?”。这是我的建议。

    a=replicate(100, list(fn()))
    

    a[[1]] 返回第一个结果

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多