对多个数据框中的列进行汇总统计,并将结果存储在表中

Do summary stats on columns across multiple data frames and store results in a table

提问人:dan 提问时间:11/9/2023 最后编辑:dan 更新时间:11/9/2023 访问量:51

问:

你们能帮我一个循环吗?

我对循环有点熟悉,但显然还不够:)for (){}

mean20neg <- mean(negative20$`19/20`)
mean20pos <- mean(positive20$`19/20`)
sd20neg <- sd(negative20$`19/20`)
sd20pos <- sd(positive20$`19/20`)

如果我想运行这些 在一个循环中(并将结果放在末尾的表中)对于多个其他数据帧,如 negative21/22 和 positive21/22,我该如何处理这些列?

其他可能有帮助的一点:如何取消列出 data.frame?因为现在由于某些原因,这些是一个列表,我不能用来解决该列。mean(negative20[2])

谢谢

xxx <- CEPSird2[ ,c("year","id_zewo","ird2")]
id_zewo <- as.numeric(CEPSird2[CEPSird2$year==2019, c("id_zewo")])

result <- c()
for (i in id_zewo) {
  value <- xxx %>%
    filter(id_zewo %in% i, year > 2018) %>%
    select(3)
  Wert1 <- value$ird2[2]-value$ird2[1]
  Wert2 <- value$ird2[3]-value$ird2[2]
  Wert3 <- value$ird2[4]-value$ird2[3]
  result <- rbind(result, c(i,Wert1,Wert2,Wert3))
}
ÄnderungAbsolut <- as_tibble(result)
colnames(ÄnderungAbsolut) <- c("id_zewo","19/20","20/21","21/22")

positive20 <- ÄnderungAbsolut[ÄnderungAbsolut$`19/20`>0, ]
positive20 <- positive20[order(positive20$`19/20`, decreasing = TRUE), c("id_zewo","19/20")]

positive21 <- ÄnderungAbsolut[ÄnderungAbsolut$`20/21`>0, ]
positive21 <- positive21[order(positive21$`20/21`, decreasing = TRUE), c("id_zewo","20/21")]

positive22 <- ÄnderungAbsolut[ÄnderungAbsolut$`21/22`>0, ]
positive22 <- positive22[order(positive22$`21/22`, decreasing = TRUE), c("id_zewo","21/22")]

negative20 <- ÄnderungAbsolut[ÄnderungAbsolut$`19/20`<0, ]
negative20 <- negative20[order(negative20$`19/20`), c("id_zewo","19/20")]

negative21 <- ÄnderungAbsolut[ÄnderungAbsolut$`20/21`<0, ]
negative21 <- negative21[order(negative21$`20/21`), c("id_zewo","20/21")]

negative22 <- ÄnderungAbsolut[ÄnderungAbsolut$`21/22`<0, ]
negative22 <- negative22[order(negative22$`21/22`), c("id_zewo","21/22")]
R 循环 索引 多列 lapply

评论


答:

0赞 uke 11/9/2023 #1

大多数情况下,当你认为 R 中需要循环时,你不需要循环,但你可能需要 和 列表。forlapply()

  1. 将所有数据框放在一个列表中
  2. 用于从该列表中的每个数据框中提取特定列lapply()
  3. 用于计算提取列的摘要统计信息lapply()
  4. 将结果取消列出到向量中
  5. 用这些向量制作一个表格,显示结果。

请注意,我使用了三个示例数据集 (和 ) 来使此代码可重现。irismtcarstrees

df_list <- list(iris, mtcars, trees)

# extract e.g. the first column of each data set
extracted_cols <- lapply(df_list, purrr::pluck, 1)

# result is yet another list
# compute summary stats, use `lapply` because columns are still inside a list

mean_value <- lapply(extracted_cols, mean) |> unlist()
#> 5.843333 20.090625 13.248387

sd_value <- lapply(extracted_cols, sd) |> unlist()
#> 0.8280661 6.0269481 3.1381386

# put them in a table

results <- data.frame(id = 1:length(extracted_cols), mean_value, sd_value)
#>   id mean_values sd_values
#> 1  1    5.843333 0.8280661
#> 2  2   20.090625 6.0269481
#> 3  3   13.248387 3.1381386

关于您的问题:

如何解决这些列问题?

如何取消列出 Data.frame?

我知道你说的“取消列出”是什么意思,你不想将该列作为具有 1 列的数据框,而是作为向量,这样您就可以对该列进行数值计算,而不会让函数抱怨。

  • [ ]在一个数据帧上返回另一个数据帧
  • [[ ]]在数据帧上以向量形式返回列
  • $是 的一种特殊形式,使用列名,并且具有相同的结果:向量。[[ ]]

如果数据框位于列表中:使用 ,则可以访问每个数据框中的特定列,如下所示:lapply()

lapply(df_list, `[[`, 1) # gets first column of each data frame

purrr::pluck()是运算符的通用且更安全的替代方案,并且更适合键入和阅读,这就是我使用它的原因(但这是一种意见)。[[

lapply(df_list, purrr::pluck, 1) # does the same but safer

在这两种变体中,代码获取 中包含的每个数据帧的第一列。它返回一个列表,其中每个元素都包含相应数据框的第一列。df_list

您可以替换为您喜欢的任何数字或字符串,例如您的数据示例。如果所有列在不同的数据框中具有相同的名称,则该字符串是有意义的。如果它们的名称不同,但位于同一位置,则可以使用该数字为该位置编制索引。如果您的相关列既不在同一位置,也不具有相同的名称,也许您应该事先进行一些数据清理以实现此目的。1"19/20"

评论

1赞 dan 11/9/2023
非常感谢,这对我有很大帮助。
0赞 dan 11/9/2023
但我还有另一个问题。而不是 lapply() 函数中的平均值,我怎样才能在那里进行正常计算? 我想计算这些,但如何将它们应用于 lapply 函数?Anteil20neg <- sum(cumsum(negative20$`19/20`)/sum(negative20$`19/20`)<0.75) Anteil20pos <- sum(cumsum(positive20$`19/20`)/sum(positive20$`19/20`)<0.75)
0赞 uke 11/9/2023
在里面,你需要一个函数。您可以事先声明一个函数来执行您的计算,也可以在调用中创建一个匿名函数。请注意,有很多方法可以做到这一点,该包附带了一个运算符来动态声明匿名函数。我只会使用一个简单的匿名函数:lapply()lapply()purrr~lapply(extracted_cols, function(x) sum(cumsum(x) / sum(x) < 0.75))
0赞 dan 11/9/2023
非常感谢。如果我现在需要再次创建所有这些步骤(从第一个答案开始),我该如何为此创建一个循环?假设这些数据帧(负 20、正 20 等)用于 Data1(在示例中,它的“ird2”需要替换),现在我需要对 Data2、Data3 执行相同的步骤......它们都来自同一个主数据集。这是我是如何知道的,你能帮我解决这个问题吗?@uke 我将代码添加到我的问题中,以便您可以查看,希望您能帮助我:)
1赞 dan 11/9/2023
我提出了一个新问题,也许你可以@uke帮助我。谢谢。stackoverflow.com/questions/77452338/......