2015-09-22 38 views
5

Gegeben:Vector Subsetting vs. Liste Subsetting

actors_vector <- c("Jack Nicholson", "Shelley Duvall", "Danny Lloyd", 
        "Scatman Crothers", "Barry Nelson") 

reviews_factor <- factor(c("Good", "OK", "Good", "Perfect", 
          "Bad", "Perfect", "Good"), 
         levels = c("Bad", "OK", "Good", "Perfect"), 
         ordered = TRUE) 

shining_list <- list(title = "The Shining", 
        actors = actors_vector, 
        reviews = reviews_factor) 

shining_list 
$title 
[1] "The Shining" 

$actors 
[1] "Jack Nicholson" "Shelley Duvall" "Danny Lloyd"  "Scatman Crothers" 
[5] "Barry Nelson"  

$reviews 
[1] Good OK  Good Perfect Bad  Perfect Good 
Levels: Bad < OK < Good < Perfect 

$boxoffice 
       US Non-US 
First release 39  47 
Director's cut 18  14 

Warum shining_list[[3]][3] und shining_list$reviews[3] Rückkehr:

[1] Good 
Levels: Bad < OK < Good < Perfect 

Während shining_list[[c(3,3)]] Rückkehr:

[1] 3 

Dies ist ein Abschnitt auf Vektor Subsetting vs List Subsetting unter DataCamp.

+1

Sie haben einen Faktor in Bewertungen. Wenn Sie den Extrakt mit 'c (3,3)' machen, wird er in eine ganze Zahl umgewandelt. –

+0

Das OP fragt _why_, obwohl. Es steht in Konflikt mit _ "' [[] kann rekursiv auf Listen angewendet werden, so dass, wenn der einzelne Index 'i' ein Vektor der Länge' p' ist, 'alist [[i]]' äquivalent zu 'alist [[i1 ]] '...' [[ip]] 'liefert alle bis auf die abschließenden Indizierungsergebnisse in einer Liste.", aber 'shining_list [[3]] [[3]]' gibt '[1] Good' /' evels zurück : Schlecht und nicht nur '[1] 3'. – hrbrmstr

Antwort

4

Dies aufgrund der Tatsache am wahrscheinlichsten ist, dass Faktoren, die nicht-Vektoren sind:

unclass(reviews) 
## [1] 3 2 3 4 1 4 3 
## attr(,"levels") 
## [1] "Bad"  "OK"  "Good" "Perfect" 

:

reviews <- factor(c("Good", "OK", "Good", "Perfect", "Bad", "Perfect", "Good"), 
        levels=c("Bad", "OK", "Good", "Perfect"), ordered=TRUE) 
is.vector(reviews) 
## [1] FALSE 

Intern werden die Faktor-Ebenen als Integer Vektor mit einer gewissen Struktur oben definiert gespeichert sind, In einigen Fällen wird diese Struktur zusammenbrechen und Sie haben nur noch die Integer-Darstellung. Ich denke, dass Ihr Beispiel ist einer dieser Fälle, ein paar andere sind:

c(reviews[3], reviews[4]) 
## [1] 3 4 
ifelse(TRUE, reviews[1], reviews[2]) 
## [1] 3