mutate()中已弃用的.data[[ ]]的推荐替代方案是什么?
替代
.data[[ ]]实现列别名的方案 自tidyselect 1.2.0起,.data[[ ]]已被弃用,以下是几种用存储列名的向量创建列别名的可行方案:
方案1:使用!!sym()注入列名
这是最接近原写法的替代方式,通过sym()将字符串列名转换为符号,再用!!注入到表达式中:
mycolname <- 'cyl' mtcars %>% mutate(newcol = !!sym(mycolname)) %>% head()
输出结果与原代码一致:
# mpg cyl disp hp drat wt qsec vs am gear carb newcol # Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 6 # Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 6 # Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 4 # Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 6 # Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 8 # Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 6
方案2:使用pick()提取列向量
dplyr 1.1.0及以上版本可用pick()选择列,再通过[[1]]将单列tibble转为向量:
mtcars %>% mutate(newcol = pick(all_of(mycolname))[[1]]) %>% head()
该方案无需使用注入语法,更符合tidyverse的现代写法。
方案3:直接重命名列(若无需保留原列)
如果你的需求是重命名原列而非新增别名,可直接用rename()配合all_of():
mtcars %>% rename(newcol = all_of(mycolname)) %>% head()
为什么之前的across()方案会出错?
across()的设计目的是批量处理多列,即使只选择一列,它返回的也是单列tibble,将其赋值给newcol会导致数据框嵌套,从而出现显示乱码和"corrupt data frame"警告。我们需要的是向量而非嵌套数据结构,因此不适合用across()来实现单列表别名。
内容的提问来源于stack exchange,提问作者saQuist
相关产品推荐
相关产品推荐

