【问题标题】:Sort a data.table programmatically using character vector of multiple column names使用多列名称的字符向量以编程方式对 data.table 进行排序
【发布时间】:2018-05-10 22:24:37
【问题描述】:

我需要在作为变量名的字符向量提供的多个列上对 data.table 进行排序。

这是我目前的方法:

DT = data.table(x = rep(c("b","a","c"), each = 3), y = c(1,3,6), v = 1:9)

#column names to sort by, stored in a vector
keycol <- c("x", "y")

DT[order(keycol)]
   x y v
1: b 1 1
2: b 3 2

不知何故,它只显示 2 行并删除其他记录。但如果我这样做:

DT[order(x, y)]
   x y v
1: a 1 4
2: a 3 5
3: a 6 6
4: b 1 1
5: b 3 2
6: b 6 3
7: c 1 7
8: c 3 8
9: c 6 9

它像流体一样工作。 任何人都可以帮助使用列名向量进行排序吗?

【问题讨论】:

  • order(keycol) 返回1:2。使用单个参数,data.table 行上的子集。此行为与 data.frame 不同,后者是列上的子集。您是在告诉 data.table 保留第 1 行和第 2 行。
  • setkeyv(DT, c('x', 'y'))如果你想钥匙和订购

标签: r sorting data.table


【解决方案1】:

您需要?setorderv 及其cols 参数:

x 的列名的字符向量,用于排序

library(data.table)
DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
#column vector
keycol <-c("x","y")
setorderv(DT, keycol)
DT
   x y v
1: a 1 4
2: a 3 5
3: a 6 6
4: b 1 1
5: b 3 2
6: b 6 3
7: c 1 7
8: c 3 8
9: c 6 9

请注意,无需将setorderv 的输出分配回DT。该函数通过引用更新DT

【讨论】:

  • setorderv 有一个 order 参数,您可以将其设置为 -1 以降序排序。
猜你喜欢
  • 1970-01-01
  • 2015-02-08
  • 2020-10-21
  • 2020-09-04
  • 2011-06-23
  • 2021-11-21
  • 2016-09-30
  • 2021-03-18
相关资源
最近更新 更多