Szukaj…


Składnia

  • melt(DT, id.vars=c(..), variable.name="CategoryLabel", value.name="Value") ze melt(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 


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow