在 R 中使用字符串列表作为变量的 for 循环 - 带引号和不带引号

for loop in R using a list of strings as variables - with and without quotes

提问人:Polina Putrik 提问时间:9/21/2021 最后编辑:Rui BarradasPolina Putrik 更新时间:9/21/2021 访问量:1378

问:

我想创建一个循环,该循环将运行字符串列表。此字符串列表包含需要插入语法的变量的名称。我的语法有时需要带引号(然后它起作用),有时需要不带引号(然后它失败了)。我已经尝试了这里的解决方案:从 R 中的字符向量中删除引号,但它不起作用。

这是我尝试执行的操作示例:

library(dplyr)

data(mtcars)
list=c("mpg", "cyl")
for (i in list) {
  print(i)
  df=mtcars[,c(i, "gear")] #this works
  df1 = group_by(df, gear) %>% summarize(Y=sum(i)) # this doesn't work - it doesn't recognize i as variable name
}

感谢您的帮助

问候 波琳娜

R 字符串 循环 行情

评论

3赞 r2evans 9/21/2021
通常,在经常使用的基本 R 函数之后命名变量是一种不好的做法。虽然不是语法错误(而且 R 通常知道你的意图),但我建议不要用作变量名称。list

答:

1赞 Quixotic22 9/21/2021 #1

尝试用 .iget

for (i in list) {
  print(i)
  df=mtcars[,c(i, "gear")] #this works
  df1 = group_by(df, gear) %>% summarize(Y=sum(get(i))) # this doesn't work - it doesn't recognize i as variable name
}

也值得一读等等sym!!

评论

0赞 Limey 9/21/2021
正如@RuiBarradas在下面指出的那样,这会覆盖循环每次迭代的数据帧,这不太可能是 OP 的意图。df1
0赞 Rui Barradas 9/21/2021 #2

要更正访问字符变量给出的变量的错误,请使用 。!!rlang::sym(i)

for (i in list) {
  print(i)
  df=mtcars[,c(i, "gear")] #this works
  df1 = group_by(df, gear) %>% summarize(Y = sum(!!rlang::sym(i)))
}

但是问题的代码中还有另一个错误,每次通过循环都会重写输出。
这是一个更正后的循环。
df1

df_list <- lapply(list, function(i){
  print(i)
  df <- mtcars[,c(i, "gear")] #this works
  group_by(df, gear) %>% summarize(Y = sum(!!rlang::sym(i)))
})

df_list[[1]]
## A tibble: 3 x 2
#   gear     Y
#  <dbl> <dbl>
#1     3  242.
#2     4  294.
#3     5  107.

评论

2赞 aosmith 9/21/2021
还要注意 .data 代词,它在处理字符串和整洁计算时很有用。例如,sum(.data[[i]])
0赞 Rui Barradas 9/22/2021
@aosmith 您可以将您的评论作为答案发布,恕我直言,这正是问题所要求的,当求和作为字符变量给出时要放入什么。sum