R Language
Pivot och unpivot med data.table
Sök…
Syntax
- Smält med
melt(DT, id.vars=c(..), variable.name="CategoryLabel", value.name="Value")
-
dcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
meddcast(DT, LHS ~ RHS, value.var="Value", fun.aggregate=sum)
parametrar
Parameter | detaljer |
---|---|
id.vars | berätta melt vilka kolumner som ska behållas |
variable.name | berätta melt vad du ska kalla kolumnen med kategoriliketter |
value.name | berätta melt vad du ska kalla kolumnen som har värden associerade med kategorimärken |
value.var | berätta för dcast var du hittar värdena som ska kastas i kolumner |
formel | berätta för dcast vilka kolumner som ska behållas för att bilda en unik postidentifierare (LHS) och vilken som har kategorimärkningarna (RHS) |
fun.aggregate | ange vilken funktion som ska användas när casting-operationen genererar en lista över värden i varje cell |
Anmärkningar
Mycket av det som går till konditioneringsdata för att bygga modeller eller visualiseringar kan åstadkommas med data.table
. Jämfört med andra alternativ erbjuder data.table
fördelar med snabbhet och flexibilitet.
Pivot och unpivot tabelldata med data.table - I
Konvertera från bred form till lång form
Ladda data USArrests
från 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
Använd ?USArrests
att ta reda på mer. Konvertera först till data.table
. data.frame
namn är data.frame
i det ursprungliga data.frame
.
library(data.table)
DT <- as.data.table(USArrests, keep.rownames=TRUE)
Detta är data i den breda formen. Den har en kolumn för varje variabel. Uppgifterna kan också lagras i lång form utan förlust av information. Den långa formen har en kolumn som lagrar variabelnamnen. Sedan har den en annan kolumn för variabla värden. Den långa formen av USArrests
ser ut så.
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
Vi använder melt
att växla från bred form till lång form.
DTm <- melt(DT)
names(DTm) <- c("State", "Crime", "Rate")
Som standard behandlar melt
alla kolumner med numeriska data som variabler med värden. I USArrests
representerar variabeln UrbanPop
den procentuella stadsbefolkningen i en stat. Det skiljer sig från de andra variablerna, Murder
, Assault
och Rape
, som är våldsbrott rapporterade per 100 000 människor. Anta att vi vill behålla UrbanPop
kolumnen. Vi uppnår detta genom att ställa in id.vars
enligt följande.
DTmu <- melt(DT, id.vars=c("rn", "UrbanPop" ),
variable.name='Crime', value.name = "Rate")
names(DTmu)[1] <- "State"
Observera att vi har angett namnen på kolumnen som innehåller kategorinamn (Mord, attack etc.) med variable.name
och kolumnen som innehåller värden med value.name
. Våra data ser så ut.
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
Att generera sammanfattningar med en metod med split-applicera-kombinera stil är en bris. Till exempel, för att sammanfatta våldsbrott av staten?
DTmu[, .(ViolentCrime = sum(Rate)), by=State]
Detta ger:
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
Pivot och unpivot tabelldata med data.table - II
Konvertera från lång form till bred form
För att återställa data från föregående exempel, använd dcast
så sätt.
DTc <- dcast(DTmu, State + UrbanPop ~ Crime)
Detta ger informationen i den ursprungliga breda formen.
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
Här används formelnotationen för att specificera kolumnerna som bildar en unik postidentifierare (LHS) och kolumnen som innehåller kategoritiketter för nya kolumnnamn (RHS). Vilken kolumn ska du använda för numeriska värden? Som standard använder dcast
den första kolumnen med numeriska värden som finns kvar från formelspecifikationen. För att uttrycka value.var
använder du parametervärdet.var med value.var
.
När operationen ger en lista med värden i varje cell, dcast
ger en fun.aggregate
metod för att hantera situationen. Säg att jag är intresserad av stater med liknande stadsbefolkning när man undersöker brottsfrekvensen. Jag lägger till en kolumn Decile
med beräknad information.
DTmu[, Decile := cut(UrbanPop, quantile(UrbanPop, probs = seq(0, 1, by=0.1)))]
levels(DTmu$Decile) <- paste0(1:10, "D")
Nu ger casting Decile ~ Crime
flera värden per cell. Jag kan använda fun.aggregate
att avgöra hur dessa hanteras. Både text och numeriska värden kan hanteras på detta sätt.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
Detta ger:
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=mean)
Detta ger:
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
Det finns flera stater i varje decil av stadsbefolkningen. Använd fun.aggregate
att specificera hur dessa ska hanteras.
dcast(DTmu, Decile ~ Crime, value.var="Rate", fun.aggregate=sum)
Detta summerar uppgifterna för liknande stater, vilket ger följande.
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