2016-04-26 10 views
5

Chcę przekazać nazwę kolumny do kolumny i używać funkcji indeksowania i funkcja setorder:Przełęcz data.table kolumna nazwy w funkcji

require(data.table) 
data(iris) 

top3 = function(t, n) { 
    setorder(t, n, order=-1) 
    return (t[1:3, .(Species, n)]) 
} 

DT = data.table(iris) 
top3(DT, Petal.Width) 

to jednak zwraca błąd:

Error in setorderv(x, cols, order, na.last) : some columns are not in the data.table: n,1

Myślę, że nieporozumienie, jak przemijające nazwy kolumny bez podpisu działają w R. Jakie są moje opcje?

Odpowiedz

7

Można zrobić

top3 = function(DT, nm) eval(substitute(DT[order(-nm), .(Species, nm)][, head(.SD, 3L)])) 
top3(DT, Petal.Width) 

    Species Petal.Width 
1: virginica   2.5 
2: virginica   2.5 
3: virginica   2.5 

Radziłbym przed (1) setorder wewnątrz funkcji, ponieważ ma skutków ubocznych; (2) indeksowanie z 1:3, kiedy możesz użyć tego na tablicy data.table z mniej niż trzema rzędami w przyszłości, na dziwny efekt; (3) ustalenie 3 zamiast uczynienia z niego argumentu funkcji; i (4) używanie n dla nazwy ... po prostu moje osobiste preferencje rezerwowania n dla zliczeń.

2

Zakładając, że twój zestaw danych będzie zawsze miał więcej niż 3 wiersze i jest to TYLKO operacja, którą chcesz wykonać w tej tabeli danych, może to być w twoim interesie użycie numeru setorderv.

top3 = function(t, n) { 
    setorderv(t, n, -1) 
    return (t[1:3, c("Species", n), with=FALSE]) 
} 

DT = data.table(iris) 
top3(DT, "Petal.Width") 

Wynik:

 Species Petal.Width 
1: virginica   2.5 
2: virginica   2.5 
3: virginica   2.5