【问题标题】:Is there a way to repeat a function a fixed number of times and save every result as a data frame?有没有办法重复一个函数固定次数并将每个结果保存为数据框?
【发布时间】:2019-12-02 20:03:24
【问题描述】:

假设我有一个看起来像这样的数据框

A <- c(1:100)
B <- c(0.5:100)
df <- data.frame(A,B)

我想从这个数据框中得到 25 个随机行

df[sample(nrow(df), size = 25, replace = FALSE),]

但现在我想重复这个示例函数 100 次并单独保存每个结果。 我尝试使用重复功能,但找不到保存每个结果的方法。

谢谢。

【问题讨论】:

标签: r


【解决方案1】:
  • 如 cmets 中所述,replicate 实现可以达到您的目标,即,
res <- replicate(100,df[sample(nrow(df), size = 25, replace = FALSE),],simplify = F)
  • 另一种方法是使用sapply(或lapply),即,
res <- sapply(1:100, function(k) df[sample(nrow(df), size = 25, replace = FALSE),],simplify = F)

res <- lapply(1:100, function(k) df[sample(nrow(df), size = 25, replace = FALSE),])

【讨论】:

    【解决方案2】:

    replicate() 是解决此问题的绝佳选择。

    如果您希望将最终结果放在一个包含 ID 变量列的表中,您可以使用 dplyr 包中的 bind_rows()。下面是一个较小的示例(来自 10 行数据集中的 3 个样本),可以更轻松地理解 replicate() 的行为:

    library(dplyr, warn.conflicts = FALSE)
    
    # make a smaller data set of 10 rows
    d <- data.frame(
      A = 1:10,
      B = LETTERS[1:10]
    ) %>% print
    #>     A B
    #> 1   1 A
    #> 2   2 B
    #> 3   3 C
    #> 4   4 D
    #> 5   5 E
    #> 6   6 F
    #> 7   7 G
    #> 8   8 H
    #> 9   9 I
    #> 10 10 J
    
    # create 3 samples, with each sample containing 4 rows
    reps <- replicate(3, d[sample(nrow(d), 4, FALSE), ], simplify = FALSE) %>% print
    #> [[1]]
    #>   A B
    #> 2 2 B
    #> 5 5 E
    #> 6 6 F
    #> 1 1 A
    #> 
    #> [[2]]
    #>   A B
    #> 3 3 C
    #> 2 2 B
    #> 5 5 E
    #> 8 8 H
    #> 
    #> [[3]]
    #>   A B
    #> 4 4 D
    #> 9 9 I
    #> 3 3 C
    #> 8 8 H
    
    # bind the list elements into a single tibble, with an ID column for the sample
    bind_rows(reps, .id = "sample_id")
    #>    sample_id A B
    #> 1          1 2 B
    #> 2          1 5 E
    #> 3          1 6 F
    #> 4          1 1 A
    #> 5          2 3 C
    #> 6          2 2 B
    #> 7          2 5 E
    #> 8          2 8 H
    #> 9          3 4 D
    #> 10         3 9 I
    #> 11         3 3 C
    #> 12         3 8 H
    

    reprex package (v0.3.0) 于 2019 年 12 月 2 日创建

    【讨论】:

    • 谢谢。我现在正在使用myfun &lt;- function(){ df[sample(nrow(df), size = 25, replace = FALSE),] } 作为我的功能。有没有办法在我的函数中为每个样本获取 A 列的总和?
    • 请不要在多个答案后发表相同的评论。这使得跟踪响应变得更加困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2021-05-13
    • 2021-01-10
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多