R Language
Pivot i unpivot z data.table
Szukaj…
Składnia
-
melt(DT, id.vars=c(..), variable.name="CategoryLabel", value.name="Value")
zemelt(DT, id.vars=c(..), variable.name="CategoryLabel", value.name="Value")
-
dcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
pomocądcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
Parametry
Parametr | Detale |
---|---|
id.vars | powiedzieć melt które kolumny zachować |
nazwa zmiennej | powiedzieć melt jak nazwać kolumnę z etykietami kategorii |
wartość.nazwa | powiedzieć melt co nazwać kolumną, która ma wartości związane z etykietami kategorii |
wartość.var | powiedz dcast gdzie znaleźć wartości do rzutowania w kolumnach |
formuła | powiedz dcast które kolumny zachować, aby utworzyć unikalny identyfikator rekordu (LHS), a który zawiera etykiety kategorii (RHS) |
fun.aggregate | określ funkcję, która ma być używana, gdy operacja rzutowania generuje listę wartości w każdej komórce |
Uwagi
Wiele z tego, co wchodzi w warunkowanie danych do budowy modeli lub wizualizacji, można osiągnąć za pomocą data.table
. W porównaniu do innych opcji, data.table
oferuje zalety szybkości i elastyczności.
Przestawianie i cofanie przestawiania danych tabelarycznych za pomocą data.table - I
Konwertuj z formy szerokiej na długą
Wczytaj data USArrests
z datasets
.
data("USArrests")
head(USArrests)
Murder Assault UrbanPop Rape
Alabama 13.2 236 58 21.2
Alaska 10.0 263 48 44.5
Arizona 8.1 294 80 31.0
Arkansas 8.8 190 50 19.5
California 9.0 276 91 40.6
Colorado 7.9 204 78 38.7
Użyj ?USArrests
aby dowiedzieć się więcej. Najpierw przekonwertuj na data.table
. Nazwy stanów są nazwami wierszy w oryginalnej data.frame
.
library(data.table)
DT <- as.data.table(USArrests, keep.rownames=TRUE)
To są dane w szerokiej formie. Ma kolumnę dla każdej zmiennej. Dane mogą być również przechowywane w długiej formie bez utraty informacji. Długi formularz ma jedną kolumnę, która przechowuje nazwy zmiennych. Następnie ma inną kolumnę dla wartości zmiennych. Tak wygląda długa forma USArrests
.
State Crime Rate
1: Alabama Murder 13.2
2: Alaska Murder 10.0
3: Arizona Murder 8.1
4: Arkansas Murder 8.8
5: California Murder 9.0
---
196: Virginia Rape 20.7
197: Washington Rape 26.2
198: West Virginia Rape 9.3
199: Wisconsin Rape 10.8
200: Wyoming Rape 15.6
Używamy funkcji melt
aby przełączyć się z formy szerokiej na długą.
DTm <- melt(DT)
names(DTm) <- c("State", "Crime", "Rate")
Domyślnie melt
traktuje wszystkie kolumny z danymi liczbowymi jako zmienne z wartościami. W USArrests
zmienna UrbanPop
reprezentuje procent populacji miejskiej danego stanu. Różni się od innych zmiennych: Murder
, Assault
i Rape
, które są przestępstwami z użyciem przemocy zgłoszonymi na 100 000 osób. Załóżmy, że chcemy zachować kolumnę UrbanPop
. Osiągamy to, ustawiając id.vars
w następujący sposób.
DTmu <- melt(DT, id.vars=c("rn", "UrbanPop" ),
variable.name='Crime', value.name = "Rate")
names(DTmu)[1] <- "State"
Zauważ, że podaliśmy nazwy kolumny zawierającej nazwy kategorii (Morderstwo, Napaść itp.) Za pomocą variable.name
oraz kolumny zawierającej wartości z value.name
. Tak wyglądają nasze dane.
State UrbanPop Crime Rate
1: Alabama 58 Murder 13.2
2: Alaska 48 Murder 10.0
3: Arizona 80 Murder 8.1
4: Arkansas 50 Murder 8.8
5: California 91 Murder 9.0
Generowanie podsumowań przy użyciu podejścia typu dziel-zastosuj-połącz to pestka. Na przykład, aby podsumować brutalne przestępstwa według państwa?
DTmu[, .(ViolentCrime = sum(Rate)), by=State]
To daje:
State ViolentCrime
1: Alabama 270.4
2: Alaska 317.5
3: Arizona 333.1
4: Arkansas 218.3
5: California 325.6
6: Colorado 250.6
Przestawianie i cofanie przestawiania danych tabelarycznych za pomocą data.table - II
Konwertuj z długiej formy na szeroką formę
Aby odzyskać dane z poprzedniego przykładu, użyj dcast
takiego.
DTc <- dcast(DTmu, State + UrbanPop ~ Crime)
Daje to dane w oryginalnej szerokiej formie.
State UrbanPop Murder Assault Rape
1: Alabama 58 13.2 236 21.2
2: Alaska 48 10.0 263 44.5
3: Arizona 80 8.1 294 31.0
4: Arkansas 50 8.8 190 19.5
5: California 91 9.0 276 40.6
Tutaj zapis formuły służy do określenia kolumn, które tworzą unikalny identyfikator rekordu (LHS) i kolumny zawierającej etykiety kategorii dla nowych nazw kolumn (RHS). Której kolumny użyć dla wartości liczbowych? Domyślnie dcast
używa pierwszej kolumny z wartościami liczbowymi pozostałymi po specyfikacji formuły. Aby wyrazić to wyraźnie, użyj parametru value.var
z nazwą kolumny.
Gdy operacja tworzy listę wartości w każdej komórce, dcast
udostępnia metodę fun.aggregate
do obsługi sytuacji. Powiedzmy, że interesują mnie stany o podobnej populacji miejskiej podczas badania wskaźników przestępczości. Dodaję kolumnę Decile
z obliczonymi informacjami.
DTmu[, Decile := cut(UrbanPop, quantile(UrbanPop, probs = seq(0, 1, by=0.1)))]
levels(DTmu$Decile) <- paste0(1:10, "D")
Teraz rzutowanie Decile ~ Crime
generuje wiele wartości na komórkę. Mogę użyć fun.aggregate
aby ustalić, jak są obsługiwane. W ten sposób można obsługiwać zarówno tekst, jak i wartości liczbowe.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
To daje:
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=mean)
To daje:
State UrbanPop Crime Rate Decile
1: Alabama 58 Murder 13.2 4D
2: Alaska 48 Murder 10.0 2D
3: Arizona 80 Murder 8.1 8D
4: Arkansas 50 Murder 8.8 2D
5: California 91 Murder 9.0 10D
W każdym decylu ludności miejskiej występuje wiele stanów. Użyj fun.aggregate
aby określić, jak mają być obsługiwane.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
To sumuje dane dla podobnych stanów, dając następujące.
Decile Murder Assault Rape
1: 1D 39.4 808 62.6
2: 2D 35.3 815 94.3
3: 3D 22.6 451 67.7
4: 4D 54.9 898 106.0
5: 5D 42.4 758 107.6