如何在base R的sort_by()中传入变量名向量实现排序
如何用base R按外部指定的列向量排序数据框
你遇到的问题根源在于:~ list(name_vec)会把整个向量作为单个排序键传入sort_by(),而非将向量中的每个元素对应为一列来排序,自然得不到预期结果。
如果想用base R实现按外部指定的列向量排序数据框,核心是利用order()函数,结合do.call()来传递多列参数,具体实现如下:
# 定义要排序的列名向量 name_vec <- c("am", "mpg") # 生成排序后的行索引:将指定列作为order的参数 sorted_idx <- do.call(order, mtcars[name_vec]) # 按索引对数据框排序 sorted_mtcars <- mtcars[sorted_idx, ]
原理说明
mtcars[name_vec]会从数据框中提取指定的列,返回一个包含目标列的子数据框do.call(order, mtcars[name_vec])等价于手动调用order(mtcars$am, mtcars$mpg),自动将子数据框的每一列作为order()的参数,生成正确的排序索引- 最后用索引提取数据框的行,得到按指定列排序后的结果
如果你坚持想用sort_by()(注意:sort_by()实际属于purrr包而非base R)实现传向量排序,也可以通过动态构造公式来实现:
library(purrr) name_vec <- c("am", "mpg") # 动态构造排序公式 sort_formula <- as.formula(paste0("~ list(", paste(name_vec, collapse = ", "), ")")) # 执行排序 sort_by(mtcars, sort_formula)
但如你需求,base R的order()方案更直接且无需依赖第三方包。
内容的提问来源于stack exchange,提问作者jdenn0514
相关产品推荐
相关产品推荐

