R语言for循环用字符串列表作变量:带/不带引号场景问题处理
问题核心原因
dplyr采用非标准评估逻辑,直接在summarize等函数内传入存储列名字符串的变量i时,dplyr会将其识别为普通字符串对象,而非数据框中的列名,因此sum(i)本质是对字符串求和,自然无法运行。
解决方案
以下是两种常用的可直接运行的实现方式:
方案1:使用.data代词(推荐,适配dplyr 1.0及以上版本)
用.data[[列名字符串]]的格式可以直接将字符串映射为当前操作数据框的对应列,修改后代码如下:
library(dplyr) data(mtcars) # 注意不要用list作为变量名,list是R内置函数,重名易引发冲突 var_list = c("mpg", "cyl") for (i in var_list) { print(i) df = mtcars[,c(i, "gear")] df1 = group_by(df, gear) %>% summarize(Y=sum(.data[[i]])) print(df1) }
方案2:符号转换+解引用
先通过sym()函数将字符串转换为R语言的符号对象,再用!!(双感叹号,俗称bang-bang)解引用后传入dplyr函数即可:
library(dplyr) data(mtcars) var_list = c("mpg", "cyl") for (i in var_list) { print(i) df = mtcars[,c(i, "gear")] df1 = group_by(df, gear) %>% summarize(Y=sum(!!sym(i))) print(df1) }
内容的提问来源于stack exchange,提问作者Polina Putrik
相关产品推荐
相关产品推荐

