我试图使用
for
循环在数据框中创建新列,我正在努力开发新的变量进行分析,但我发现这样做有很多问题。
我有几个与政党对几个政治问题的重视程度相关的变量,我想为每个问题创建变量,同时考虑政党收到的选票份额(以便确定有多少选票份额与强调有关)我由 x 方提出的问题)。
因此,新列将应用以下操作:i_emphasis * pervote。
我编写的代码源自我在 Stack 中检查的另一个响应,因为我的前几次尝试进展得很糟糕,但我仍然看不到发生了什么。这是目前的代码:
vars <- c(y2016_ESP$per101:y2016_ESP$per706)
y2016_ESP %>%
for (i_var in vars){
i_emphasis <- paste0("supp_i_",i_var)
mod_y2016_ESP <- y2016_ESP %>%
mutate(!!sym(i_emphasis) := i_var*pervote)
}
i_var
是包含所有“问题重点”列的向量,它应该迭代,并且它似乎是给出问题的向量。我不明白为什么,因为 c()
应该获取每一列并将其包含在向量中(至少,我认为它应该这样做)。
注意:对于当前的代码,我只是将其应用于简化的数据帧,因为我想测试它并首先描述性地检查这个小 df,然后将其普遍应用于更广泛的数据帧。我看到其他一些人使用函数
apply()
或 lapply()
来做类似的事情,但我更熟悉编程语言中典型的 for
循环。
我认为以下就是您想要的。
library(dplyr)
y2016_ESP <- data.frame(
per101 = 1:5,
per501 = rnorm(5),
per706 = runif(5)
)
pervote <- .5
# mutate creates new columns
y2016_ESP |>
dplyr::mutate(
dplyr::across(per101:per706, # tidy select all columns between `per101` and `per706`
~ .x * pervote, # dplyr style anonymous function
.names = "supp_i_{.col}") # glue style naming of new columns
)
我认为您的困惑来自于将基础 R 和 dplyr 的 tidy-select 概念混合在一起。
vars <- c(y2016_ESP$per101:y2016_ESP$per706)
在基本 R 中并没有真正意义,但该样式是使用 dplyr
使用 across
选择列的一种方法。
上面评论中的glue
指的是Rglue包。它的操作通常类似于 Python 的 f 字符串。
您通常希望在基本 R 风格或 dplyr 风格之间进行选择,并避免过多混合概念。 (当然,这并不总是正确的。)
如果您经常使用 data.frames,我推荐这本书 R for Data Science。
如果你真的想循环变量名,你可以使用基本 R 而不是 dplyr
for (var in list_var) {
df[[var]] # do your thing
}