.EACHI w danych.stolik?
Nie mogę znaleźć żadnej dokumentacji na temat tego, co dokładnie .EACHI
robi w data.table
. W tej chwili nie ma nic do rzeczy.]}
Agregacja dla podzbioru znanych grup jest szczególnie efektywna przy przechodzeniu tych grup w i i ustawieniu
by=.EACHI
. Gdyi
jest data.Tabela,DT[i,j,by=.EACHI]
oceniaj
dla grupDT
, które każdy wierszi
łączy się z. Grupę tę nazywamy przez każde i.
Ale co "grupy" w kontekście Wredny? Czy grupa jest określona przez klucz, który jest ustawiony na DT
? Czy grupa jest każdym odrębnym wierszem, który używa wszystkich kolumn jako klucza? W pełni rozumiem, jak uruchomić coś takiego jak DT[i,j,by=my_grouping_variable]
, ale jestem zdezorientowany, jak .EACHI
będzie działać. Czy ktoś może wyjaśnić?
1 answers
Dodałem to do listy tutaj . I miejmy nadzieję, że będziemy w stanie dostarczyć zgodnie z planem.
Powodem jest najprawdopodobniej to, że by=.EACHI
jest najnowszą funkcją (od 1.9.4), ale to, co robi, nie jest . Pozwól, że wyjaśnię na przykładzie. Załóżmy, że mamy dwa dane.tabele X
i Y
:
X = data.table(x = c(1,1,1,2,2,5,6), y = 1:7, key = "x")
Y = data.table(x = c(2,6), z = letters[2:1], key = "x")
Wiemy, że możemy dołączyć robiąc X[Y]
. jest to podobne do operacji podzbioru, ale używając data.tables
(zamiast liczb całkowitych / nazw wierszy lub wartości logicznych). Dla każdego wiersza Y
, biorąc kolumny klucza Y
, znajduje i zwraca odpowiednie pasujące wiersze w kolumnach klucza X
(+kolumny w Y
) .
X[Y]
# x y z
# 1: 2 4 b
# 2: 2 5 b
# 3: 6 7 a
Załóżmy, że chcemy, aby dla każdego wiersza z kolumn klucza Y
(tutaj tylko jedna kolumna klucza), chcemy uzyskać liczbę dopasowań w X
. W wersjach data.table
, możemy to zrobić po prostu podając .N
w j
w następujący sposób:
# < 1.9.4
X[Y, .N]
# x N
# 1: 2 2
# 2: 6 1
Co to w domyśle robi, w obecność j
, Oceń j-expression
dla każdego dopasowanego wyniku X
(odpowiadającego wierszowi w Y
). To zostało nazwane by-without-by lub implicit-by , ponieważ to tak, jakby było ukryte przez.
Problem polegał na tym, że to zawsze będzie wykonywać by
operację. Tak więc, jeśli chcemy znać liczbę wierszy po połączeniu, musimy zrobić: X[Y][ .N]
(lub po prostu nrow(X[Y])
w tym przypadku). Oznacza to, że nie możemy mieć j
wyrażenia w tym samym wywołaniu, jeśli nie chcemy by-without-by
. W rezultacie, gdy zrobiliśmy na przykład X[Y, list(z)]
, oceniliśmy list(z)
używając by-without-by
i dlatego był nieco wolniejszy.
Dodatkowo data.table
użytkownicy zażądali, aby to było jawne - zobacz this i this aby uzyskać więcej kontekstu.
Stąd by=.EACHI
został dodany. Teraz, kiedy robimy:
X[Y, .N]
# [1] 3
Robi to ,co jest przeznaczone do zrobienia (unika zamieszania). Zwraca liczbę wierszy wynikającą z połączenia.
I,
X[Y, .N, by=.EACHI]
Ocenia j
- wyrażenie na pasujących wierszach dla każdego wiersza w Y
(odpowiadające wartości z kolumn klucza Y
tutaj). Łatwiej byłoby to zobaczyć używając which=TRUE
.
X[.(2), which=TRUE] # [1] 4 5
X[.(6), which=TRUE] # [1] 7
Jeśli biegniemy .N
dla każdego, to powinniśmy otrzymać 2,1.
X[Y, .N, by=.EACHI]
# x N
# 1: 2 2
# 2: 6 1
Więc teraz mamy obie funkcje. Mam nadzieję, że to pomoże.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:39