2016-04-26 4 views
5

voglio passare un nome di colonna a una funzione e l'uso della colonna l'indicizzazione e la funzione setorder:Passo colonna data.table per nome in funzione

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) 

Tuttavia, questo restituisce un errore:

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

Penso di non aver capito come passare nomi di colonne vuote in R. Quali sono le mie opzioni?

risposta

7

Si può fare

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 

Vorrei consigliare contro la (1) setorder all'interno di una funzione, dal momento che ha effetti collaterali; (2) indicizzazione con 1:3 quando è possibile utilizzarlo su un data.table con meno di tre righe in futuro, con un effetto strano; (3) fissare 3 invece di renderlo un argomento alla funzione; e (4) usando n per nome ... solo la mia preferenza personale per prenotare n per i conteggi.

2

Supponendo che il set di dati abbia sempre più di 3 righe e che questa è l'unica operazione che si desidera eseguire su quella tabella di dati, potrebbe essere nel proprio interesse utilizzare 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") 

Risultato:

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