Jaki jest najlepszy sposób przypisywania do wielu kolumn przy użyciu data.table
? Na przykład:
f <- function(x) {c("hi", "hello")}
x <- data.table(id = 1:10)
Chciałbym zrobić coś takiego (oczywiście ta składnia jest niepoprawna):
x[ , (col1, col2) := f(), by = "id"]
Aby to rozszerzyć, mogę mieć wiele kolumn z nazwami przechowywanymi w zmiennej (powiedzmy col_names
) i chciałbym zrobić:
x[ , col_names := another_f(), by = "id", with = FALSE]
Jaki jest właściwy sposób zrobienia czegoś takiego?
by
jak słusznie powiedzieć @Christoph_J. Link do twojego pytania dodany do FR # 2120 "Porzuć wymaganie z = FALSE dla LHS z: =", więc nie zapomnisz o ponownej wizycie.f()
jest to funkcja zwracająca wiele wartości, po jednej dla każdej kolumny.Odpowiedzi:
Działa to teraz w wersji 1.8.3 w R-Forge. Dzięki za podkreślenie tego!
Starsza wersja używająca
with
argumentu (odradzamy ten argument, jeśli to możliwe):źródło
data.table(objectName=ls())[,c("rows","cols"):=dim(get(objectName)),by=objectName]
(Używamdata.table
1.8.11)dim
zwraca wektor, więc konwertując go, aby wpisać tekst ,list
należy go obrócić; np[,c("rows","cols"):=as.list(dim(get(objectName))),by=objectName]
. Problem polega na tym, żeas.list
narzut wywołania, a także kopiuje mały wektor. Jeśli wydajność jest problemem w miarę wzrostu liczby grup, prosimy o poinformowanie nas o tym.x[,mynames:=list(mean(b)*4,sum(b)*3),by=a,with=FALSE][]
) Generuje teraz ostrzeżenie, więc może je usunąć? A propos, czy ktoś zasugerował, żeoptions(datatable.WhenJisSymbolThenCallingScope=TRUE)
zadanie takie jakx[,mynames:=list(mean(b)*4,sum(b)*3),by=a]
powinno w rzeczywistości zadziałać? Wydaje się, że byłoby to spójne z innymi zmianami, chociaż wydaje mi się, że może to spowodować zbyt duże uszkodzenie istniejącego kodu użytkownika (?).by=a
tego zadziała, ale zwróci inną odpowiedź.mean(a)
Isum(a)
kruszywo są utylizowane w każdej grupie Kiedyby=a
. Bezby=a
tego po prostu wklejamean
isum
dla całej kolumny do każdej komórki (tj. Różne liczby).Przydatna może być następująca notacja skrócona. Cała zasługa Andrew Brooksa, a konkretnie tego artykułu .
źródło