【问题标题】:Making a for loop with dplyr, group_by, summarize, and saving the output of each variable in a list使用 dplyr、group_by、summary 进行 for 循环,并将每个变量的输出保存在列表中
【发布时间】:2021-04-20 15:25:12
【问题描述】:

我想创建一个函数,将输出保存在列表中。我关心的是如何使用 dplyr group_by 和摘要指定哪一列。想象一个大数据集。请参阅下面的更多 cmets。

trt <- rep(LETTERS[1:3],3)
qw <- sample(100,9)
tr <- sample(100,9)
df <- data.frame(trt,qw,tr)


  df %>%
  group_by(trt) %>%
  summarise(mean.mpg = mean(qw, na.rm = TRUE),
            sd.mpg = sd(qw, na.rm = TRUE),
            n.mpg = n())%>%
  mutate(se.mpg = sd.mpg / sqrt(n.mpg),
         lower.ci.mpg = mean.mpg - qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg,
         upper.ci.mpg = mean.mpg + qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg)
 

为什么 n[i] 不起作用?应该如何指定它才能在函数中使用它?

n <- colnames(df)[2:3]
   

df %>%
   group_by(trt) %>%
   summarise(mean.mpg = mean(n[i], na.rm = TRUE),   
             sd.mpg = sd(n[i], na.rm = TRUE),
             n.mpg = n())%>%
   mutate(se.mpg = sd.mpg / sqrt(n.mpg),
          lower.ci.mpg = mean.mpg - qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg,
          upper.ci.mpg = mean.mpg + qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg)

最后我想制作这个循环并将输出保存在一个列表中

list_Data <- list()

for (i in 2:ncol(df)){
  list_Data[[i]]<- df %>%
    group_by(trt) %>%
    summarise(mean.mpg = mean(n[i], na.rm = TRUE),
              sd.mpg = sd(n[i], na.rm = TRUE),
              n.mpg = n())%>%
    mutate(se.mpg = sd.mpg / sqrt(n.mpg),
           lower.ci.mpg = mean.mpg - qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg,
           upper.ci.mpg = mean.mpg + qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg)
}

想要的输出:

  [[1]]
    # A tibble: 3 x 7
      trt   mean.mpg sd.mpg n.mpg se.mpg lower.ci.mpg upper.ci.mpg
      <chr>    <dbl>  <dbl> <int>  <dbl>        <dbl>        <dbl>
    1 A         35.7   32.9     3   19.0        -46.0         117.
    2 B         46     37.2     3   21.5        -46.5         139.
    3 C         64.3   47.8     3   27.6        -54.4         183.


[[2]]
# A tibble: 3 x 7
  trt   mean.mpg sd.mpg n.mpg se.mpg lower.ci.mpg upper.ci.mpg
  <chr>    <dbl>  <dbl> <int>  <dbl>        <dbl>        <dbl>
1 A         57.7   40.5     3   23.4        -42.8         158.
2 B         49.3   31.0     3   17.9        -27.7         126.
3 C         32.7   34.8     3   20.1        -53.8         119.

【问题讨论】:

    标签: r dplyr tidyeval


    【解决方案1】:

    一种选择是索引.data 代词,这可以在列名存储为字符串时完成:

    for (i in 1:length(n)){        # <-- Note the change from 2:ncol(df)
      list_Data[[i]]<- df %>%
        group_by(trt) %>%
        summarise(mean.mpg = mean(.data[[n[i]]], na.rm = TRUE),   # <-- .data pronoun here
                  sd.mpg = sd(.data[[n[i]]], na.rm = TRUE),       #       and here
                  n.mpg = n())%>%
        mutate(se.mpg = sd.mpg / sqrt(n.mpg),
               lower.ci.mpg = mean.mpg - qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg,
               upper.ci.mpg = mean.mpg + qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg)
    }
    

    【讨论】:

      【解决方案2】:

      您必须使用 rlang 包中的 sym 函数,然后使用称为 bang bang 运算符的 !! 取消引用它。在这里,因为您提供了一个字符串作为列名,所以您需要首先将其转换为一个符号,该符号实际上指向数据集中的一个对象,然后您必须告诉 R 在数据集的上下文中评估它使用!! 运算符进行强制评估。您可以通过 tidyverse here 了解编程的基础知识。

      library(rlang)
      
      n <- colnames(df)[2:3]
      list_Data <- vector("list", length = ncol(df) - 1)
      
      for (i in 1:(ncol(df)-1)){
        list_Data[[i]] <- df %>%
          group_by(trt) %>%
          summarise(mean.mpg = mean(!!sym(n[i]), na.rm = TRUE),
                    sd.mpg = sd(!!sym(n[i]), na.rm = TRUE),
                    n.mpg = n()) %>%
          mutate(se.mpg = sd.mpg / sqrt(n.mpg),
                 lower.ci.mpg = mean.mpg - qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg,
                 upper.ci.mpg = mean.mpg + qt(1 - (0.05 / 2), n.mpg - 1) * se.mpg)
      }
      
      
      > list_Data
      [[1]]
      # A tibble: 3 x 7
        trt   mean.mpg sd.mpg n.mpg se.mpg lower.ci.mpg upper.ci.mpg
        <chr>    <dbl>  <dbl> <int>  <dbl>        <dbl>        <dbl>
      1 A         62.7   30.6     3  17.7        -13.4         139. 
      2 B         36.7   14.0     3   8.09         1.86         71.5
      3 C         17.7   16.5     3   9.53       -23.3          58.7
      
      [[2]]
      # A tibble: 3 x 7
        trt   mean.mpg sd.mpg n.mpg se.mpg lower.ci.mpg upper.ci.mpg
        <chr>    <dbl>  <dbl> <int>  <dbl>        <dbl>        <dbl>
      1 A           49   38.0     3   21.9        -45.4        143. 
      2 B           36   21.7     3   12.5        -17.8         89.8
      3 C           30   26.9     3   15.5        -36.8         96.8
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-11
        相关资源
        最近更新 更多