R Language Utilizzo di base di split


Esempio

split consente di dividere un vettore o un data.frame in bucket per quanto riguarda le variabili di un fattore / gruppo. Questa ventilazione nei secchi assume la forma di un elenco, che può essere quindi utilizzato per applicare il calcolo a gruppi ( for loop o lapply / sapply ).

Il primo esempio mostra l'uso della split su un vettore:

Considera il seguente vettore di lettere:

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

L'obiettivo è separare tali lettere in voyels e consonants , ovvero dividerle in base al tipo di lettera.

Creiamo prima un vettore di raggruppamento:

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

Si noti che letter_type ha la stessa lunghezza del nostro vettore testdata . Ora possiamo split questi dati di test nei due gruppi, vowels e consonants :

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

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

Quindi, il risultato è un elenco di nomi che provengono dal nostro vettore di raggruppamento / fattore letter_type .

split ha anche un metodo per gestire data.frames.

Si consideri, ad esempio, i dati iris :

data(iris)

Utilizzando split , è possibile creare un elenco contenente un data.frame per specie di iris (variabile: Specie):

> 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

(contiene solo i dati per il gruppo setosa).

Un'operazione di esempio sarebbe quella di calcolare la matrice di correlazione per specie di iris; uno avrebbe quindi usato 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

Quindi possiamo recuperare per gruppo la migliore coppia di variabili correlate: (la matrice di correlazione viene rimodellata / fusa, la diagonale viene filtrata e viene selezionata la registrazione migliore)

> 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

Si noti che i calcoli vengono eseguiti a livello di gruppo, uno può essere interessato a impilare i risultati, che può essere fatto con:

> (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