如何使用列名字符向量对data.table进行多列排序?
如何用字符向量指定列名对data.table排序?
你遇到的问题很典型——直接把存储列名的字符向量传给order()时,它并没有去提取data.table中对应的列,而是把这个字符向量本身当成了排序依据,所以才会出现只返回部分行的错误结果。下面给你几种靠谱的解决方法:
方法1:用do.call()调用order()
这是最常用的方式,通过do.call把字符向量里的列名对应到DT的列上,让order()正确识别排序依据:
DT = data.table(x = rep(c("b","a","c"), each = 3), y = c(1,3,6), v = 1:9) keycol <- c("x", "y") # 正确写法 DT[do.call(order, DT[, keycol, with = FALSE])]
运行后就能得到和直接写DT[order(x, y)]完全一样的完整排序结果。
方法2:结合.SDcols和do.call()
这种写法更简洁,利用data.table的.SD(Subset of Data)特性:
DT[do.call(order, .SD), .SDcols = keycol]
.SDcols = keycol指定了.SD只包含我们要排序的列,然后do.call(order, .SD)就会按这些列排序。
方法3:用get()函数提取列
通过sapply循环遍历字符向量里的列名,用get()取出对应的列再传给order():
DT[order(sapply(keycol, function(col) get(col)))]
这种写法逻辑直观,适合理解底层原理。
方法4:用setkeyv()设置排序键
如果你需要长期按这些列排序,可以用data.table特有的setkeyv()函数设置键,之后直接调用DT[]就会按键排序:
setkeyv(DT, keycol) DT[] # 此时已经是按x、y排序后的结果
内容的提问来源于stack exchange,提问作者RajnishDwivedy
相关产品推荐
相关产品推荐

