如何在dplyr的summarise中结合.data[[ ]]与for循环使用实际变量名?
动态设置dplyr summarise的列名(tidy evaluation练习)
你可以通过dplyr的动态列名语法(结合:=操作符和解引用操作符!!)来实现需求,把循环中的变量名替换掉固定的"name"列名,具体有两种简洁的写法:
方法1:字符串转符号后解引用
data("mtcars") for (var in names(mtcars)) { mtcars |> summarise(!!sym(var) := mean(.data[[var]])) |> print() }
sym(var):把循环中的字符串变量var转换成R的符号对象(符合tidy evaluation的要求)!!:解引用符号对象,告诉dplyr这里要使用动态生成的列名:=:替代常规的=,允许左侧是动态表达式,实现动态列名赋值
方法2:直接对字符串解引用(dplyr 1.0.0+支持)
如果你的dplyr版本是1.0.0及以上,可以更简洁地直接使用字符串变量:
data("mtcars") for (var in names(mtcars)) { mtcars |> summarise(!!var := mean(.data[[var]])) |> print() }
新版本的dplyr支持直接对字符串使用!!来生成动态列名,省去了sym()转换的步骤。
为什么原代码不行?
原代码中summarise(name = mean(.data[[var]]))里的name是固定字符串,dplyr会直接将其作为列名,而不会解析变量var的值。通过:=和!!的组合,我们才能让dplyr把var的实际值当作列名来使用。
内容的提问来源于stack exchange,提问作者LucaS
相关产品推荐
相关产品推荐

