为何names(df)在dplyr::arrange()中无效?如何使其正常工作
问题分析与解决方法
原因
dplyr的arrange()函数默认要求传入裸列名(比如直接写arrange(mpg, cyl)),而你传入的是存储列名的字符向量nam。此时arrange()会把nam当成一个独立的向量处理,不会将其解析为要排序的列名,自然无法按预期对mtcars的列进行排序。
解决办法
有三种常用方式可以让代码正常工作:
方式一:使用.data代词结合解引用操作符!!!
利用.data代词引用字符向量对应的列,再通过!!!将字符向量中的每个列名拆分为arrange()的独立参数:
nam <- names(mtcars) mtcars2 <- mtcars %>% arrange(!!!.data[nam])
方式二:使用across()配合all_of()
通过across()指定要排序的列范围,all_of()用来精准匹配字符向量中的列名:
nam <- names(mtcars) mtcars2 <- mtcars %>% arrange(across(all_of(nam)))
方式三:用rlang包的syms()转换为符号后解引用
先将字符向量转换为R语言的符号对象,再通过!!!解引用传入arrange():
library(rlang) nam <- names(mtcars) mtcars2 <- mtcars %>% arrange(!!!syms(nam))
内容的提问来源于stack exchange,提问作者jkatam
相关产品推荐
相关产品推荐

