2013-07-02 14 views
5

Chciałbym zastosować funkcję do wszystkich kolumna w data.table. Dlatego używam .SD z lapply. Ale w lapply nie mogę odzyskać kolumny mojego stolika.Pobierz nazwę kolumny wewnątrz lapply z .SD

Na przykład

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 

I wykonaj następujące czynności:

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

możemy zrobić lepiej?

Odpowiedz

4

wystarczy usunąć .SDcols=c(1,2). który usuwa trzecią kolumnę (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 

nie mamy id, wszystko będzie działać następuje:

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

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

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

Dzięki! Czy istnieje sposób na uniknięcie stosowania funkcji w kolumnie i? – Nicolas

+1

@Nicolas, sprawdź moją edycję. Mała wskazówka, jeśli zależy Ci na szybkości, spróbuj zawsze nadać swojej funkcji najbardziej zwartą strukturę (często oznacza to szybszy kod). – Michele

+0

Podobają mi się pierwsze z trzech podanych przez ciebie alternatyw, chociaż użycie '.SD' staje się zbędne. Myślę, że 'x [, lapply (list (a, b),' * ', id)]' jest najlepszym rozwiązaniem i nie wymaga pisania więcej niż używanie '.SDcols' w pierwszej kolejności. –