Utworzyliśmy nowy (i bardziej kompleksowy) HTML vignettes dla niektórych data.table pojęć. Zajrzyj here dla innych winiet, nad którymi pracujemy. Pracuję nad winietami dla złączeń, które, gdy to zrobię, zapewnią lepsze wyjaśnienie tego typu problemów.
Chodzi o to, aby pierwszy setkey()
na DT1
na kolumnie tract
.
setkey(DT1, tract)
W data.tables, sprzężenie formy x[i]
wymaga klucza dla x
, ale niekoniecznie dla i
. Wynika to z dwóch scenariuszy:
Jeśli i
posiada również zestaw kluczy - pierwszy klucz kolumna i
jest porównywana z pierwszego klucza kolumnie x
, drugi z drugiej i tak dalej ..
Jeśli i
nie posiada zestawu kluczy - pierwsza kolumna i
jest porównywana z pierwszej klucz kolumnie x
, drugiej kolumnie i
przeciwko drugim klucz kolumnie x
i tak dalej ..
W tym przypadku, ponieważ Twoja pierwsza kolumna w i
jest również tract
będziemy pomijać ustawienie klucza na i
.
Następnie wykonujemy sprzężenie w postaci x[i]
. Robiąc to, dla każdego i
obliczane są pasujące indeksy wierszy w x
, a następnie wynik sprzężenia zostaje zmaterializowany. Jednak nie chcemy, aby cały wynik sprzężenia był nowym plikiem data.table. Przeciwnie, chcemy zaktualizować DT1
's CreditScore
kolumnę DT2
temat tych pasujących wierszy ..
W data.tables, możemy wykonać tę operację łączenia, dostarczając wyraz w j
, w następujący sposób:
DT1[DT2, CreditScore := i.CreditScore]
# tract CreditScore
# 1: 36067013000 777
# 2: 36083052304 663
# 3: 36083052403 650
# 4: 36091062602 335
# 5: 36107020401 635
DT1[DT2
część znajduje pasujące wiersze w DT1
dla każdego wiersza w DT2
. A jeśli jest dopasowanie, chcemy zaktualizować wartość DT2
w DT1
.Osiągamy to, używając parametru i.CreditScore
- odnosi się on do kolumny DT2
() (prefiks używany do odróżniania kolumn o identycznych nazwach między x
i i
data.tables).
Aktualizacja: Jak zauważył pod uwag, powyższe rozwiązanie byłoby również zaktualizować wartości non-NA w DT1
. Dlatego droga do zrobienia byłoby:
DT1[is.na(CreditScore), CreditScore := DT2[.(.SD), CreditScore]]
Z powyższych wierszy gdzie CreditScore
z DT1
jest NA
wymienić CreditScore
z DT1
z wartościami z CreditScore
uzyskanych od łączenia z DT2[.(.SD)]
, gdzie .SD
odpowiada podzbioru danych .table, który zawiera wszystkie wiersze, gdzie CreditScore
jest NA
.
HTH
Jeśli używasz pakietu 'data.table', musisz to wyjaśnić w pytaniu. Nie jest dla mnie jasne, czy masz na myśli strukturę danych charakterystyczną dla 'data.table' czy też struktury bazowej' data.frame'. Czy istnieje powód (np. Obawy dotyczące rozmiaru/pamięci), że nie można po prostu scalić dwóch tabel i użyć 'ifelse()' do utworzenia nowej kolumny, która ma odpowiednią wartość? –
@Alex, tak, jest. Równie dobrze mógłby załadować dane do Excela i zrobić "widok", nieprawdaż? Mówiąc dokładniej, 'data.table' może dokonać * binarnego * łączenia i aktualizacji kolumn * przez odniesienie podczas dołączania *. Byłoby to bardziej wydajne niż 'scalanie' +' ifelse' przez kilka czynników na dużym zbiorze danych. –
Dziękuję za uwagi. Tak, głównym powodem, dla którego zdecydowałem się użyć pakietu data.table jest jego ogólna wydajność. Nie chciałem dodawać kolejnej kolumny do DT1, jeśli nie potrzebowałem. Spróbuję odpowiedzi poniżej i zobaczę, jak to działa ..... dzięki i pozdrawiam! – user3067851