Suche…


Grundlegende Verwendung von Split

split können Sie einen Vektor oder einen data.frame in Buckets hinsichtlich einer Faktor- / Gruppenvariablen unterteilen. Diese Belüftung in Buckets erfolgt in Form einer Liste, lapply sapply gruppenweise Berechnungen ( for Schleifen oder lapply / sapply ) durchgeführt werden können.

Das erste Beispiel zeigt die Verwendung von split für einen Vektor:

Betrachten Sie den folgenden Buchstabenvektor:

testdata <- c("e", "o", "r", "g", "a", "y", "w", "q", "i", "s", "b", "v", "x", "h", "u")

Ziel ist es, diese Briefe in voyels und consonants voyels , dh entsprechend dem Buchstabentyp aufzuteilen.

Zuerst erstellen wir einen Gruppierungsvektor:

 vowels <- c('a','e','i','o','u','y')
 letter_type <- ifelse(testdata %in% vowels, "vowels", "consonants") 

Beachten Sie, dass letter_type dieselbe Länge hat wie unsere testdata . Jetzt können wir split diese Testdaten in den beiden Gruppen, vowels und consonants :

split(testdata, letter_type)
#$consonants
#[1] "r" "g" "w" "q" "s" "b" "v" "x" "h"

#$vowels
#[1] "e" "o" "a" "y" "i" "u"

Das Ergebnis ist also eine Liste, deren Namen von unserem Gruppierungsvektor / Faktor letter_type .

split hat auch eine Methode, um mit data.frames umzugehen.

Betrachten Sie zum Beispiel iris :

data(iris)

Mit split kann man eine Liste mit einem data.frame pro Irisart erstellen (variabel: Species):

> liris <- split(iris, iris$Species)
> names(liris)
[1] "setosa"     "versicolor" "virginica"
> head(liris$setosa)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

(enthält nur Daten für die Setosa-Gruppe).

Eine Beispieloperation wäre die Berechnung der Korrelationsmatrix pro Irisart; man würde dann lapply :

> (lcor <- lapply(liris, FUN=function(df) cor(df[,1:4])))

    $setosa
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000   0.7425467    0.2671758   0.2780984
Sepal.Width     0.7425467   1.0000000    0.1777000   0.2327520
Petal.Length    0.2671758   0.1777000    1.0000000   0.3316300
Petal.Width     0.2780984   0.2327520    0.3316300   1.0000000

$versicolor
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000   0.5259107    0.7540490   0.5464611
Sepal.Width     0.5259107   1.0000000    0.5605221   0.6639987
Petal.Length    0.7540490   0.5605221    1.0000000   0.7866681
Petal.Width     0.5464611   0.6639987    0.7866681   1.0000000

$virginica
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000   0.4572278    0.8642247   0.2811077
Sepal.Width     0.4572278   1.0000000    0.4010446   0.5377280
Petal.Length    0.8642247   0.4010446    1.0000000   0.3221082
Petal.Width     0.2811077   0.5377280    0.3221082   1.0000000

Dann können wir pro Gruppe das beste Paar von korrelierten Variablen abrufen: (Korrelationsmatrix wird umgeformt / geschmolzen, Diagonale wird herausgefiltert und die Auswahl des besten Datensatzes wird durchgeführt)

> library(reshape)
> (topcor <- lapply(lcor, FUN=function(cormat){
   correlations <- melt(cormat,variable_name="correlatio); 
   filtered <- correlations[correlations$X1 != correlations$X2,];
   filtered[which.max(filtered$correlation),]
}))    

$setosa
           X1           X2     correlation
2 Sepal.Width Sepal.Length       0.7425467

$versicolor
            X1           X2     correlation
12 Petal.Width Petal.Length       0.7866681

$virginica
            X1           X2     correlation
3 Petal.Length Sepal.Length       0.8642247

Beachten Sie, dass eine Berechnung auf einer solchen gruppenweisen Ebene durchgeführt wird. Möglicherweise interessieren Sie sich für das Stapeln der Ergebnisse. Dies kann folgendermaßen durchgeführt werden:

> (result <- do.call("rbind", topcor))

                     X1           X2     correlation
setosa      Sepal.Width Sepal.Length       0.7425467
versicolor  Petal.Width Petal.Length       0.7866681
virginica  Petal.Length Sepal.Length       0.8642247

Verwenden von Split im Split-Apply-Combine-Paradigma

Eine beliebte Form der Datenanalyse ist das Aufteilen-Anwenden-Kombinieren , bei dem Sie Ihre Daten in Gruppen aufteilen, für jede Gruppe eine Art Verarbeitung durchführen und dann die Ergebnisse kombinieren.

Betrachten wir eine Datenanalyse, bei der wir die zwei Autos mit den besten Meilen pro Gallone (mpg) für jede Zylinderanzahl (cyl) im eingebauten mtcars-Datensatz erhalten möchten. Zuerst teilen wir den mtcars nach der Zylinderanzahl auf:

(spl <- split(mtcars, mtcars$cyl))
# $`4`
#                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
# Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
# Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
# ...
# 
# $`6`
#                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
# ...
# 
# $`8`
#                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
# Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
# Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
# ...

Dies hat eine Liste von Datenrahmen zurückgegeben, einen für jede Zylinderanzahl. Wie durch die Ausgabe angegeben ist , könnten wir den entsprechenden Datenrahmen mit erhalten spl$`4` , spl$`6` und spl$`8` (einige könnten es optisch ansprechender zu verwenden spl$"4" oder spl[["4"]] statt.

Jetzt können wir lapply um durch diese Liste zu lapply , indem wir unsere Funktion verwenden, die die Autos mit den besten 2 mpg-Werten aus jedem Listenelement extrahiert:

(best2 <- lapply(spl, function(x) tail(x[order(x$mpg),], 2)))
# $`4`
#                 mpg cyl disp hp drat    wt  qsec vs am gear carb
# Fiat 128       32.4   4 78.7 66 4.08 2.200 19.47  1  1    4    1
# Toyota Corolla 33.9   4 71.1 65 4.22 1.835 19.90  1  1    4    1
# 
# $`6`
#                 mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4 Wag  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
# 
# $`8`
#                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
# Pontiac Firebird  19.2   8  400 175 3.08 3.845 17.05  0  0    3    2

Schließlich können wir alles mit rbind . Wir wollen rbind(best2[["4"]], best2[["6"]], best2[["8"]]) nennen rbind(best2[["4"]], best2[["6"]], best2[["8"]]) , aber das wäre langweilig, wenn wir eine riesige Liste hätten. Als Ergebnis verwenden wir:

do.call(rbind, best2)
#                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# 4.Fiat 128          32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
# 4.Toyota Corolla    33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
# 6.Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# 6.Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# 8.Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# 8.Pontiac Firebird  19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2

Dies gibt das Ergebnis von rbind (Argument 1, eine Funktion) zurück, wobei alle Elemente von best2 (Argument 2, eine Liste) als Argumente übergeben werden.

Mit einfachen Analysen wie dieser kann es kompakter sein (und möglicherweise viel weniger lesbar!), Wenn Sie die gesamte Split-Apply-Kombination in einer einzigen Codezeile ausführen:

do.call(rbind, lapply(split(mtcars, mtcars$cyl), function(x) tail(x[order(x$mpg),], 2)))

Es ist auch erwähnenswert, dass die lapply(split(x,f), FUN) alternativ mit der Funktion ?by lapply(split(x,f), FUN) gerahmt werden kann:

by(mtcars, mtcars$cyl, function(x) tail(x[order(x$mpg),], 2))
do.call(rbind, by(mtcars, mtcars$cyl, function(x) tail(x[order(x$mpg),], 2)))


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow