SORU
12 Ocak 2010, Salı


Nasıl Doğru R Listeleri kullanılır?

Kısa bir arka plan: Birçok (çoğu?) yaygın kullanımda çağdaş programlama dilleri yaygındır, özellikle, soyut veri yapıları [soyut veri tipleri] en az bir avuç var

  • string((dizi karakterden oluşur)

  • liste(değerler sıralı bir koleksiyon

  • harita tabanlı bir tip(anahtarları değerlere eşleyen sırasız bir dizi)

R programlama dilinde, ilk iki olarak uygulanırkaraktervevektörsırasıyla.

R öğrenme başladığımda iki şey baştan beri ortadaydı: Liste R (R üst sınıf çünkü . en önemli veri türüdür ^em>Veri Çerçevesive ikincisi, ben sadece nasıl çalıştığını anlayamadı, en azından onları doğru kodum için yeterince iyi değil.

Bir kere, benim için o R gibiydiListeveri türü göster ADT basit bir uygulama (sözlükPython,NSMutableDictionaryC AmaçkarmaPerl ve Rubyedebi nesneJavascript ve benzeri).

Örneğin, Python bir sözlük, bir kurucu-değeri anahtar çiftleri geçerek, sadece onları oluşturmak (Pythondictdeğilliste):

>>> x = list("ev1"=10, "ev2"=15, "rv"="Group 1")

Ve erişim R bir Liste öğeleri gibi bir Python sözlük, örneğin, O x['ev1']. Aynı şekilde, sadece alabilirsiniz 'keys' veya sadece 'değerler':

>>> names(x)    # fetch just the 'keys' of an R list
      "ev1" "ev2" "rv"

>>> unlist(x)   # fetch just the 'values' of an R list
      10 15 "Group1"

>>> x = list("a"=6, "b"=9, "c"=3)  

>>> sum(unlist(x))
      18

ama R Listeleri de vardıraksinediğer-türü göster soyut veri yapıları (neyse öğrendiğim diller arasında). Benim tahminim bu S ilk spec, yani, zemin-up gelen verileri/istatistikleri DSL [etki alanına özel dil] tasarım için bir niyet bir sonucudur.

üçR Listeleri arasında önemli farklılıklar ve yaygın olarak kullanılan diğer dillerde eşleme türleri (e.g. Python, Perl, JavaScript):

ilkR listeleriemrettitoplama, vektörler, hatta gibi değerleri (yani, anahtarlar bir hashable değeri sadece sıralı bir tamsayı olabilir) anahtarlı olmasına rağmen. Neredeyse her zaman, bir harita verileri yazın diğer dillersıralanmamış.

ikinciListeler hiç geçirilen halde işlevlerden iade edilebilir bu işlevi çağrıldığında bir Listesiniolsa bilelistenin geri fonksiyonu (açık) (tabii ki, bir telefon . iade sonucu sararak uygulamada bu konu ile ilgilenen bir Liste oluşturucu içermez ^em>alanını listeden kaldırmak):

>>> x = strsplit(LETTERS[1:10], "")     # passing in an object of type 'character'

>>> class(x)                            # returns 'list', not a vector of length 2
      list

BirüçüncüR Listelerinin garip bir özelliği var: onlar görünmüyor başka bir ADT üyeleri, bunu daha sonra yapmayı denerseniz İlköğretim kapsayıcı bir liste zorlanır. E. g.,

>>> x = c(0.5, 0.8, 0.23, list(0.5, 0.2, 0.9), recursive=T)

>>> class(x)
      list

burada amacım belgelenmiştir nasıl dili eleştirmek için değil ya; aynı şekilde, bir şey Liste veri yapısı ile yanlış bir şey olduğunu ya da nasıl davrandığını ima etmiyorum. Düzeltmek için sonra ben doğru benim kod kullanabilirim yani nasıl çalıştığını benim anlayış.

Burada daha iyi anlamak istiyorum gibi şeyler:

  • Kuralları olan bir işlev çağrısı bir Liste (örneğin, . dönüş ne zaman olduğunu belirler ^em>strsplitifade yukarıda okunduğu)?

  • Eğer varsayılan adları açıkça bir liste (örneğin, (10,20,30,40) listesi) için bir isim değilim ama sadece ardışık tam sayılar 1 ile başlayan? (Sanırım, ama cevap evet emin falan değilim, aksi vektör w/ çağrı için bu tür bir Liste için zorlamak için mümkün olmazalanını listeden kaldırmak.

  • neden bu iki farklı operatörler, [], [[]], dönüşaynıneden?

    x = liste(1, 2, 3, 4)

    her iki ifade de geri "1":

    x[1]
    
    x[[1]]
    
  • neden bu iki ifadedeğilaynı sonucu döndürür?

    x = list(1, 2, 3, 4)
    
    x2 = list(1:4)
    

lütfen dikkatle okudum(, *?list*15)R Belgeleri--bana gelin yok ve beni sadece ben yukarıda okunduğu soru türünü cevap yardımcı olmuyor.

(son olarak, geçenlerde öğrenmiş ve uygulayan . bir R Paketi (KIZIL kullanılabilir) hash denilen kullanmaya başladı ^em>gelenekselharita türü S4 sınıfı) davranış; kesinlikle bu Paketi tavsiye ederim.)

CEVAP
12 Ocak 2010, Salı


Sadece gerçekten R list vector arasındaki farka dikkat çeker beri Sorunuzun son kısmını adresi:

Neden bu iki ifade aynı sonucu döndürmüyor?

x = liste(1, 2, 3, 4); x2 = liste(1:4)

Liste her öğe olarak başka bir sınıf içerebilir. İlk öğe bir karakter vektör olduğu bir liste var, ikinci veri çerçevesi, vb. Bu durumda, iki farklı liste oluşturduk. x dört vektör, uzunluğu 1 Her vardır. x2 uzunluğu 4 1 vektörü vardır:

> length(x[[1]])
[1] 1
> length(x2[[1]])
[1] 4

Bu tamamen farklı listeleri vardır.

R listeleri dizin değeri herhangi bir nesne ile ilişkili olabilir, her biri çok a hash map veri yapısı gibi. İşte 3 farklı sınıfları içeren bir liste basit bir örnek (fonksiyon dahil):

> complicated.list <- list("a"=1:4, "b"=1:3, "c"=matrix(1:4, nrow=2), "d"=search)
> lapply(complicated.list, class)
$a
[1] "integer"
$b
[1] "integer"
$c
[1] "matrix"
$d
[1] "function"

Son öğe arama fonksiyonu olduğu göz önüne alındığında, yani öyle diyebilirim:

> complicated.list[["d"]]()
[1] ".GlobalEnv" ...

Bu konuda son bir yorum olarak: data.frame gerçekten bir liste (veri.unutulmamalıdır belgeleri Kare):

Veri çerçevesi sınıf"veri.verilen benzersiz adları ile satır satır aynı sayıda değişken listesi"’ . çerçeve

Bir veri sütunları.Kare matris bir sütun farklı veri türleri olabilir. Bir örnek olarak, sayı ve karakter içeren bir matris oluşturmak için deneyin:

> a <- 1:4
> class(a)
[1] "integer"
> b <- c("a","b","c","d")
> d <- cbind(a, b)
> d
 a   b  
[1,] "1" "a"
[2,] "2" "b"
[3,] "3" "c"
[4,] "4" "d"
> class(d[,1])
[1] "character"

Ben ikinci sütun karakter var çünkü: ilk sütun veri türü için sayısal olarak nasıl değiştiğini unutmayın

> d[,1] <- as.numeric(d[,1])
> class(d[,1])
[1] "character"

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Digital Bounds

    Digital Boun

    19 Temmuz 2013
  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006
  • MatheusDosGames

    MatheusDosGa

    28 Aralık 2011