2013-07-02 11 views
5

Vorrei applicare una funzione a tutte le colonne in data.table. Quindi, io uso .SD con lapply. Ma all'interno di lapply non riesco a recuperare la colonna del mio tavolo.Recupera il nome della colonna all'interno del lapply con .SD

Per esempio

x = data.table(a=1:10, b=10:1, id=1:5) 
x[,lapply(.SD,function(t){t*id}),.SDcols=c(1,2)] 
Error in ..FUN(a) : object 'id' not found 

ho effettuare le seguenti operazioni:

x[,lapply(.SD,function(t){t*x$id}),.SDcols=c(1,2)] 

Possiamo fare di meglio?

risposta

4

basta rimuovere .SDcols=c(1,2). che rimuove la terza colonna (id)

> x[,lapply(.SD,function(t){t*id})] 
    a b id 
1: 1 10 1 
2: 4 18 4 
3: 9 24 9 
4: 16 28 16 
5: 25 30 25 
6: 6 5 1 
7: 14 8 4 
8: 24 9 9 
9: 36 8 16 
10: 50 5 25 

di non avere la id, tutte le proceda in questo modo:

x[,lapply(.SD[,list(a,b)], `*`, id)] 

x[,lapply(.SD[,-3, with=F], `*`, id)] 

x[,lapply(.SD, `*`,id)][, list(a,b)] 
+1

Grazie! C'è un modo per evitare di applicare la funzione sulla colonna i? – Nicolas

+1

@Nicolas controlla la mia modifica. Piccolo consiglio, se la tua mente è veloce, cerca sempre di dare alla tua funzione la struttura più compatta che puoi (spesso significa codice più veloce). – Michele

+0

Mi piace la prima delle tre alternative fornite, anche se l'uso di '.SD' diventa ridondante. Penso che 'x [, lapply (lista (a, b),' * ', id)]' sia la soluzione migliore, e non richiede più la digitazione che usare '.SDcols' in primo luogo. –

Problemi correlati