R语言如何将列名列表传入dplyr的distinct函数实现多列去重?
R语言将列名向量传入
dplyr::distinct实现多列去重的方法 直接执行distinct(df, columns)报错的核心原因是dplyr采用非标准求值规则,会直接将columns识别为数据框中名为columns的列,而非你提前定义的列名向量对象。可通过以下两种方法解决:
方法1:使用across()+all_of()组合(官方推荐)
这是dplyr 1.0.0版本之后的官方推荐写法,兼容性强、可读性高,适合绝大多数场景:
library(dplyr) # 直接传入预定义的列名向量即可 df_new <- distinct(df, across(all_of(columns)))
如果需要保留数据框中未参与去重的其他列的数值,添加.keep_all = TRUE参数即可:
df_new_keep_all <- distinct(df, across(all_of(columns)), .keep_all = TRUE)
方法2:使用tidyeval拼接运算符!!!
如果习惯使用元编程写法,可以将列名字符串向量转为符号列表后,用爆炸运算符拼接传入:
library(dplyr) # 低版本dplyr需要单独加载rlang包,新版本已内置syms函数 df_new <- distinct(df, !!!syms(columns))
两种方法运行后得到的结果与手动输入列名的运行结果完全一致,适合列数较多的场景,不需要手动逐个输入列名。
内容的提问来源于stack exchange,提问作者Katharina
相关产品推荐
相关产品推荐

