如何获取data.table中每个(选定)列的前k值索引

时间:2016-01-20 19:13:46

标签: r sorting data.table

如何找到每列的前k(比如k = 3)值的索引

> dt <- data.table( x = c(1, 1, 3, 1, 3, 1, 1), y = c(1, 2, 1, 2, 2, 1, 1) )
> dt
   x y
1: 1 1
2: 1 2
3: 3 1
4: 1 2
5: 3 2
6: 1 1
7: 1 1

必需的输出:

> output.1
   x y
1: 1 2
2: 3 4
3: 5 5

甚至更好(注意x中额外有用的降序排序):

> output.2
   var top1 top2 top3
1:   x    3    5    1
2:   y    2    4    5

拥有输出将是一个很大的帮助。

3 个答案:

答案 0 :(得分:6)

在使用sort

循环数据集的列之后,我们可以使用index.return=TRUE(使用lapply
dt[, lapply(.SD, function(x) sort(head(sort(x, 
          decreasing=TRUE, index.return=TRUE)$ix,3)))]
#   x y
#1: 1 2
#2: 3 4
#3: 5 5

或使用order

dt[, lapply(.SD, function(x) sort(head(order(-x),3)))]

答案 1 :(得分:3)

如果具有相同等级的元素的顺序并不重要,那么这个答案也是有效的 订单信息可以从data.table索引中提取。

library(data.table)
dt = data.table(x = c(1, 1, 3, 1, 3, 1, 1), y = c(1, 2, 1, 2, 2, 1, 1))
set2key(dt, x)
set2key(dt, y)

tail.index = function(dt, index, n){
    idx = attr(attr(dt, "index"), index)
    rev(tail(idx, n))
}

tail.index(dt, "__x", 3L)
#[1] 5 3 7
tail.index(dt, "__y", 3L)
#[1] 5 4 2

答案 2 :(得分:1)

这是一个冗长的解决方案,我肯定会破坏data.table包的光滑度:

dt$idx <- seq.int(1:nrow(dt))

k <- 3

top_x <- dt[order(-x), idx[1:k]]
top_y <- dt[order(-y), idx[1:k]]

dt_top <- data.table(top_x, top_y)

dt_top
#    top_x top_y
# 1:     3     2
# 2:     5     4
# 3:     1     5