提问人:dan 提问时间:11/9/2023 最后编辑:dan 更新时间:11/9/2023 访问量:51
对多个数据框中的列进行汇总统计,并将结果存储在表中
Do summary stats on columns across multiple data frames and store results in a table
问:
你们能帮我一个循环吗?
我对循环有点熟悉,但显然还不够:)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 中需要循环时,你不需要循环,但你可能需要 和 列表。for
lapply()
- 将所有数据框放在一个列表中
- 用于从该列表中的每个数据框中提取特定列
lapply()
- 用于计算提取列的摘要统计信息
lapply()
- 将结果取消列出到向量中
- 用这些向量制作一个表格,显示结果。
请注意,我使用了三个示例数据集 (和 ) 来使此代码可重现。iris
mtcars
trees
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"
评论
Anteil20neg <- sum(cumsum(negative20$`19/20`)/sum(negative20$`19/20`)<0.75) Anteil20pos <- sum(cumsum(positive20$`19/20`)/sum(positive20$`19/20`)<0.75)
lapply()
lapply()
purrr
~
lapply(extracted_cols, function(x) sum(cumsum(x) / sum(x) < 0.75))
评论