r - 使用 dplyr、group_by、summary 创建 for 循环,并将每个变量的输出保存在列表中

标签 r dplyr tidyeval

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

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.

最佳答案

一种选择是对 .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)
}

关于r - 使用 dplyr、group_by、summary 创建 for 循环,并将每个变量的输出保存在列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67181862/

相关文章:

r - R 中非数值数据的条形图

r - 如何在 R 中的每一行之间添加一行?

r - purrr::map 相当于 dplyr::do

r - 在 case_when 中制作 tidyeval 函数

r - 访问 `mutate_at` 中的列名以将其用于子集列表

r - 在sweave、xtable中,只旋转一些列名

R 传单 : addPolygons by group

r - 按组选择每次运行零之前的最后一个非零值

r - 从分组数据中选择随机的观察组(行)

r - 在ggplot中循环变量