.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. Gdy i jest data.Tabela, DT[i,j,by=.EACHI] ocenia j dla grup DT, które każdy wiersz i łą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ć?

Author: smci, 2014-11-18

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.

 118
Author: Arun,
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