2015-09-22 13 views
5

Dane:Wektor podzbiorów vs. listy podzbiorów

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 

Dlaczego shining_list[[3]][3] i shining_list$reviews[3] zwrot:

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

Zważywszy shining_list[[c(3,3)]] zwrot:

[1] 3 

To jest przekrojem Vector Podzestawianie podzestawów na liście pod adresem DataCamp.

+1

Masz czynnik w recenzjach. Gdy wykonasz ekstrakt z 'c (3,3)', zostanie on przekonwertowany na liczbę całkowitą. –

+0

OP pyta _why_, chociaż. Koliduje z _ "" [[może być zastosowany rekurencyjnie do list, więc jeśli pojedynczy indeks "i" jest wektorem długości 'p', to alist [[i]] jest równoważne' alist [[i1] ]] '...' [[ip]] 'zapewniając wszystkie wyniki końcowe, ale z wyjątkiem listy"., ale 'shining_list [[3]] [[3]]' zwraca '[1] Good' /' evels : Bad hrbrmstr

Odpowiedz

4

Najprawdopodobniej jest to spowodowane faktem, że czynniki nie są wektory:

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

wewnętrznie czynnik poziomy są przechowywane w wektorze całkowitą o pewnej strukturze określonej na górny:

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

W niektórych przypadkach struktura ta zwinie się, a ty będziesz miał tylko reprezentację całkowitą. Myślę, że Twój przykład jest jednym z tych przypadków, kilka innych to:

c(reviews[3], reviews[4]) 
## [1] 3 4 
ifelse(TRUE, reviews[1], reviews[2]) 
## [1] 3 
Powiązane problemy