使用 for 循环进行带有操作的 mutate 函数

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

我试图使用

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
循环。

r for-loop dplyr
2个回答
1
投票

我认为以下就是您想要的。

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


0
投票

如果你真的想循环变量名,你可以使用基本 R 而不是 dplyr

for (var in list_var) {
df[[var]] # do your thing
}
© www.soinside.com 2019 - 2024. All rights reserved.