2016-01-20 81 views
3

如何找到前k的指標(比如K = 3)每一列的值如何獲得前k值的指數每個(選擇)列data.table

> 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 

具有輸出將是已經有很大的幫助。

+1

你在乎等級相同值的順序?如:'x | 5 | 3 | 7; y | 5 | 4 | 2;' – jangorecki

+0

@jangorecki,是的,我寧願保持排名相同的價值秩序,但這不是絕對必須的。無論我個人在這裏需要什麼,維護原始訂單以便於調試是一種好習慣。 – Amitai

回答

6

我們可以遍歷數據集的列與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 

或之後使用sort(與index.return=TRUE)使用order

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

不錯,忘了'index.return = TRUE' –

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 
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 
+1

@DavidArenburg你說'7 <-> 1'?注意他們有相同的價值,所以他們的排名是相同的 - 這是在答案中指出的。 – jangorecki