尝试使用循环遍历数据帧列表的 for 循环来计算各种摘要

Trying to use a for loop that cycles through a list of dataframes to compute various summaries

提问人:Lukas Wood 提问时间:11/9/2023 最后编辑:Lukas Wood 更新时间:11/9/2023 访问量:33

问:

假设我有一个名为 3 列的大数据集,分别称为 a、b 和 c:fulldata

df1 <- data.frame(
  a = rnorm(4, 10), b = rnorm(4, 6), c = 1
  )

df2 <- data.frame(
  a = rnorm(6, 10), b = rnorm(6, 9), c = 2
  )

df3 <- data.frame(
  a = rnorm(8, 8), b = rnorm(8, 9), c = 3
  )

fulldata <- rbind(df1, df2)
fulldata <- rbind(fulldata, df3)

我也有基于 c 值的子集,即 c = 1 的行......以此类推 3.我有引用这些子集和列名的向量。df1

c_values <- c("df1", "df2", "df3")
columns <- c("a", "b", "c")

从本质上讲,我想为每列 a 到 c 和每个子集创建 5 个数字汇总表,就像你用 summary(x) + a 平均值得到的一样,最小值、q1、中位数等列一直到平均值。另一列指示子集的 c 值,另一列指示正在汇总哪一列(a、b 或 c)。最后,没有基于 c 值的子集,而是基于 fulldata。

编辑:很抱歉,我试图将此表格式化为问题,但在我发布后它没有出现

for (column in columns) {
  summary1 <- c(summary(df1$columns), mean(df3$columns))
  summary2 <- c(summary(df2$columns), mean(df3$columns))
  summary3 <- c(summary(df3$columns), mean(df3$columns))
} #and then bind the summaries together somehow

for (c_value in values) {
  for(column in columns)
} #bind the whole table together

在实践中,有远远超过 3 个子集和 3 个列名,因此我希望能够通过快速循环循环遍历它们,因此使用了之前的向量名称,但我似乎无法让语法起作用。

R for 循环

评论


答:

0赞 dufei 11/9/2023 #1

不确定您希望输出的确切外观,但我认为您最好使用分组摘要而不是 for 循环。

在下面的示例中,我定义了一个函数来创建摘要(根据您的喜好进行调整,例如通过包含平均值),然后将其应用于每一列:

library(tidyverse)

df1 <- tibble(
  a = rnorm(4, 10), b = rnorm(4, 6), c = 1
)

df2 <- tibble(
  a = rnorm(6, 10), b = rnorm(6, 9), c = 2
)

df3 <- tibble(
  a = rnorm(8, 8), b = rnorm(8, 9), c = 3
)

fulldata <- rbind(df1, df2, df3)

quantile_df <- function(x, probs = c(0.25, 0.5, 0.75)) {
  tibble(
    value = quantile(x, probs, na.rm = TRUE),
    quantile = probs
  )
}

fulldata |> 
  reframe(
    across(c(a, b), quantile_df, .unpack = TRUE),
    .by = c
  ) |> 
  select(c, quantile = a_quantile, a = a_value, b = b_value)
#> # A tibble: 9 × 4
#>       c quantile     a     b
#>   <dbl>    <dbl> <dbl> <dbl>
#> 1     1     0.25  8.89  5.14
#> 2     1     0.5   9.19  5.93
#> 3     1     0.75  9.54  6.52
#> 4     2     0.25  9.38  8.68
#> 5     2     0.5   9.84  9.03
#> 6     2     0.75 10.8   9.39
#> 7     3     0.25  7.67  8.03
#> 8     3     0.5   7.87  9.45
#> 9     3     0.75  8.47 10.3

创建于 2023-11-09 with reprex v2.0.2

然后,您可以调整/透视数据以更改列和行中的内容。