2013-05-12 6 views
5

mam ten kod:Nowo dodana kolumna „J” o data.table powinny być dostępne w zakresie

dat<-dat[,list(colA,colB 
        ,RelativeIncome=Income/.SD[Nation=="America",Income] 
        ,RelativeIncomeLog2=log2(Income)-log2(.SD[Nation=="America",Income])) #Read 1) 
       ,by=list(Name,Nation)] 

1) Chciałbym móc powiedzieć "RelativeIncomeLog2=log2(RelativeIncome)", ale "RelativeIncome" nie jest dostępny Zakres j?

2) Próbowałem zamiast tego (zgodnie z FAQ na temat data.table). Teraz "RelativeIncome" jest dostępny, ale nie dodać kolumny:

 dat<-dat[,{colA;colB;RelativeIncome=Income/.SD[Nation=="America",Income]; 
       ,RelativeIncomeLog2=log2(RelativeIncome)])) 
       ,by=list(Name,Nation)] 
+1

Odpowiedź Ricarda prawdopodobnie to wyjaśnia, ale funkcja 'J()' nie jest tym samym, co argument 'j' dla' [.data.table'. W celu uzyskania szczegółowych informacji wypróbuj ''? J'' i ''? '[.data.table'' '. 'J()' służy do złączeń w argumencie 'i' z' [.data.table'. – Frank

+0

Zobacz także [Jak mogę ocenić (lub utworzyć) kolumnę "w locie" na stronie data.table w r] (https://stackoverflow.com/questions/15712858/how-can-i-evaluate-or-create-an -to-the-fly-column-in-data-table-in-r) – Henrik

Odpowiedz

8

Można tworzyć i przypisywać obiekty j, wystarczy użyć { nawiasów klamrowych }.

Następnie można przekazać te obiekty (lub funkcje & obliczeń obiektów) z j i przypisać je jako kolumny tabeli data.table. Aby przypisać więcej niż jeden raz kolumnie na raz, po prostu:

  • owinąć LHS w c(.)upewnić się, że nazwy kolumn są ciągi i
  • ostatnia linia j (czyli „powrót” wartość) powinien być listą.

dat[ , c("NewIncomeComlumn", "AnotherNewColumn") := { 
       RelativeIncome  <- Income/.SD[Nation == "A", Income]; 
       RelativeIncomeLog2 <- log2(RelativeIncome); 
       ## this last line is what will be asigned. 
       list(RelativeIncomeLog2 * 100, c("A", "hello", "World")) 
       # assigned values are recycled as needed. 
       # If the recycling does not match up, a warning is issued. 
       } 
       , by = list(Name, Nation) 
       ] 

Można losely myśleć j jako funkcja w środowisku dat

Można również uzyskać dużo bardziej skomplikowane i złożone, jeśli wymagane. Można również włączyć by argumenty, jak również za pomocą by=list(<someName>=col)

W rzeczywistości, podobne do funkcji, po prostu tworzenia obiektu w j i przypisując mu wartość, nie nie oznacza, że ​​będzie on dostępny poza j. Aby można go było przypisać do pliku data.table, musisz go zwrócić. j automatycznie zwraca ostatnią linię; jeśli ten ostatni wiersz jest listą, każdy element listy będzie traktowany jak kolumna. Jeśli przypisujesz przez odniesienie (tj. Używając :=), osiągniesz oczekiwane rezultaty.


Na oddzielnej nocie, zauważyłem następujące w kodzie:

Income/.SD[Nation == "America", Income] 

# Which instead could simply be: 
Income/Income[Nation == "America"] 

.SD jest wielki, że jest wspaniałym skrótem. Jednak, aby go wywołać, nie potrzebując wszystkich kolumn, które on zawiera, należy obciążyć twój kod dodatkowymi kosztami pamięci. Jeśli używasz tylko jednej kolumny, rozważ jawne nazwanie tej kolumny lub dodaj argument .SDcols (po j) i nazwij kolumny, które są tam potrzebne.

+0

może głupie pytanie ... ale co w twoim przykładzie tylko "RelativeIncomeLog2 * 100" zostanie przypisane do NewIncomeColumn. Ale co jeśli chcę 2 nowe kolumny odpowiadające "RelativeIncome" i "RelativeIncomeLog2 * 100"? – varuman

+0

@varuman, nie głupie pytanie. Krótką odpowiedzią jest zawinięcie ostatniej linii na 'list (.)' Zobacz szczegóły powyżej, aby uzyskać szczegółowe informacje. –

+0

@RicardoSaporta, myślę, że błędem jest mieć 'by = ...' w końcówce '}'? Nie powinno przyjść po instrukcji 'list (.)'? – Arun

Powiązane problemy