【问题标题】:Rerun function and save outputs to later plot?重新运行函数并将输出保存到以后的绘图?
【发布时间】:2021-12-03 06:50:12
【问题描述】:

对 R 非常陌生,可以使用一些指导、帮助或解决方案!

我的实际数据集很大,所以我有这个包含两列的示例数据集,如下所示:

plot<- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
ID<- c("S","S","S","C","T","S","SP","T", "C", "T","S","SP","T","S","C")
dat<- data.frame(plot,ID)

我正在尝试随机删除每个图的一个条目,计算每个 ID 的频率,随机删除每个图的另一个条目,计算频率并继续重复。

到目前为止,在一些帮助下,我能够使用以下方法从每个图中随机删除一个条目

dat %>%
  group_by(plot) %>%
  sample_n(n() - 1) %>%
  ungroup()

我可以用它来计算每个 ID 的频率

dat %>%                               
  group_by(ID) %>%
  summarise(n = n()) %>%
  mutate(freq = n / sum(n))

我需要能够冲洗并重复这两个功能,并每次查看结果。这个数据集只有 15 个变量,但我的实际数据集要大得多,所以不断写出 100 次以上似乎效率低下。

是否可以同时循环或重新运行这两个函数并在每次 x 次时产生输出?例如,对于我提供的样本数据,总共可能是 4 次。我尝试了“for”循环,但我无法让它工作(很可能是我的用户错误)

感谢您的帮助!

【问题讨论】:

    标签: r function loops tidyverse frequency


    【解决方案1】:

    将这两个操作组合在一个函数中,并使用map 以不同的p 值调用它。

    library(dplyr)
    
    run_sample <- function(dat, p) {
      dat %>%
        group_by(plot) %>%
        sample_n(n() - p) %>%
        ungroup() %>%
        count(ID) %>%
        mutate(freq = n / sum(n))
    }
    
    set.seed(123)
    purrr::map(seq(n_distinct(dat$ID)), run_sample, dat = dat)
    

    这会返回一个小标题列表。

    result
    
    #[[1]]
    # A tibble: 4 x 3
    #  ID        n  freq
    #  <chr> <int> <dbl>
    #1 C         2 0.167
    #2 S         5 0.417
    #3 SP        2 0.167
    #4 T         3 0.25 
    
    #[[2]]
    # A tibble: 3 x 3
    #  ID        n  freq
    #  <chr> <int> <dbl>
    #1 C         1 0.111
    #2 S         6 0.667
    #3 T         2 0.222
    
    #[[3]]
    # A tibble: 3 x 3
    #  ID        n  freq
    #  <chr> <int> <dbl>
    #1 S         2 0.333
    #2 SP        2 0.333
    #3 T         2 0.333
    
    #[[4]]
    # A tibble: 2 x 3
    #  ID        n  freq
    #  <chr> <int> <dbl>
    #1 C         1 0.333
    #2 S         2 0.667
    

    【讨论】:

    • 哦!这几乎可以工作!我想我没有很好地解释这一点。我的意思是每次运行时都会取出另一个随机图。所以我猜第一次运行必须是 sample_n(n() - 1),第二次运行 sample_n(n() - 2),然后是 sample_n(n() - 3),然后是 sample_n(n() - 4)那里可以做吗?
    • 抱歉,误解了您的问题。检查更新的答案是否有帮助以及您正在寻找什么。
    • 所以看起来现在它的唯一 ID 数量正在增加。我将数据集更改为“S”和“T”,当它仍然应该是 4 时它只返回两个 tibbles。如果我有 3 个不同的 ID,它返回 3,4 返回 4,但第二个你得到 5唯一的 ID,所以有些是(S、T、C、SP、R)因为长度无效而无法运行
    • 我不关注,但如果您想将其硬编码为 4,您可以更改 purrr::map(1:4, run_sample, dat = dat)。不确定,如果这能回答你的问题。
    • 除了每天练习和使用 R 来变得更好之外,别无选择,但如果你想阅读一些东西,你可以试试 r4ds.had.co.nz。这是一个很好的资源。
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2019-11-05
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多