循环按列过滤

问题描述 投票:0回答:1

你们能帮我做一个循环吗?

我对

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]) 来处理该列。

谢谢

loops filter tidyverse rstudio multiple-columns
1个回答
0
投票

大多数情况下,当您认为 R 中需要

for
循环时,您并不需要循环,但您可能需要
lapply()
和列表。

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

请注意,我使用了三个示例数据集(

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)

purrr::pluck()
[[
运算符的通用且安全的形式,并且更易于输入和阅读,这就是我使用它的原因(但这是一个意见)。

lapply(df_list, `[[`, 1)

在这两种变体中,代码都会获取

df_list
中包含的每个数据帧的第一列。它返回一个列表,其中每个元素包含相应数据框的第一列。

您可以将

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

© www.soinside.com 2019 - 2024. All rights reserved.