你们能帮我做一个循环吗?
我对
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])
来解决该专栏。
谢谢
大多数情况下,当您认为 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"
。如果不同数据框中的所有列都具有相同的名称,则该字符串有意义。如果它们没有相同的名称,但位于相同的位置,则可以使用数字来索引位置。如果您的相关列既不在相同位置也不具有相同名称,也许您应该事先进行一些数据清理以实现此目的。