/ / Data.table - r, sorting, data.table में प्रत्येक (चयनित) कॉलम के लिए शीर्ष के मानों के सूचकांक कैसे प्राप्त करें

Data.table - r, sorting, data.table में प्रत्येक (चयनित) कॉलम के लिए शीर्ष के मानों के सूचकांक कैसे प्राप्त करें

प्रत्येक कॉलम के लिए शीर्ष के सूचकांक (कहें के = 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

या इससे भी बेहतर (एक्स में अतिरिक्त सहायक अवरोही क्रम को नोटिस करें):

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

आउटपुट होने से पहले से ही एक बड़ी मदद होगी।

उत्तर:

उत्तर № 1 के लिए 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)))]

जवाब के लिए 3 № 2

यदि समान रैंक वाले तत्वों का क्रम कोई फर्क नहीं पड़ता है तो यह उत्तर भी मान्य होगा।
ऑर्डर जानकारी डेटाटेबल इंडेक्स से निकाली जा सकती है।

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

उत्तर № 3 के लिए 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