SORU
17 AĞUSTOS 2010, Salı


R Gruplama fonksiyonları: geçerli lapply vs vs sapply. vs vs vs tapply tarafından toplu

Her zaman yapmak istediğim bir şey"R, py genelde apply aile içinde bir işlevi kullanmayı deneyin. "harita (Yan soru: hala plyr 16* -- *plyr reshape bütün bunlar tamamen değiştirir?) öğrenemedin mi

Ancak, hiçbir zaman tam olarak aralarındaki farkı anladım [nasıl {sapply, lapply, vb.} geçerli işlevi giriş/gruplandırılmış giriş, ne çıkış gibi görünür, hatta ne girişi olabilir, ben sık sık gidip onları tüm kadar ben ne istersem alırım.

Birisi ne zaman kullanmaya nasıl açıklayabilir?

[(Muhtemelen yanlış/tamamlanmamış) benim şimdiki anlayış

  1. sapply(vec, f): giriş vektörü. çıkış vektör elemanı i f(vec[i]) nerede/matris [f multi-element bir çıkış varsa, bir matris veriyor
  2. sapply ama çıkış listesi aynı mı? lapply(vec, f):
  3. apply(matrix, 1/2, f): giriş matrisi. çıkış 28 ** element f(matrisin satır/sütun) bir vektör
  4. tapply(vector, grouping, f): çıktı bir matris/dizi, bir elemanı matris/dizi değeri f gruplandırma g vektör ve g alır itti satır/sütun adları
  5. by(dataframe, grouping, f): g bir gruplandırma olalım. grup/dataframe her sütun için f uygulayın. yazdırma gruplandırma ve her sütun f değeri çok.
  6. aggregate(matrix, grouping, f): by ama çıkış baskı güzel yerine, toplu bir dataframe içine her şey pislik içinde.] benzer

CEVAP
21 AĞUSTOS 2011, Pazar


R hünerle yardım dosyalarında açıklanan işlevleri uygulamak *(?apply gibi). Yeni başlayan kullanıcıların zorluk durumları için uygun olduğuna karar vermek zorunda hatta hepsini hatırlamak olabilir onların yeterince vardır. Genel anlamda olabilir "*geçerli bir işlev kullanarak burada olmalıyım", ama hepsini akılda tutmak zor olabilir ilk başta.

*Uygulamak aile işlevselliğini son derece popüler plyr paketi kapsamında olduğundan (diğer yanıtlar belirtildiği) rağmen, temel işlevleri yararlı ve bilinmesi gerekenler kalır.

Bu cevap bir tür olarak hareket için tasarlanmıştırişaret levhasıyeni kullanıcılar doğru *direk onlara yardım etmek için kendi özel sorun için fonksiyonu uygulayın. Not budeğilamaçlanan sadece kusturmak veya R belgeleri değiştirmek için! Umarım bu cevap seni *geçerli fonksiyon durumunuza uygun ve daha sonra size daha fazla araştırma için hangi bir karar vermek için yardımcı olur. Bir istisna dışında, performans farklılıkları giderilecektir.

  • uygulayın-Satır veya sütunları için bir işlevi uygulamak istiyorsanız, bir matris için ilk zorlamak gibi bir matris (ve daha yüksek boyutlu analoglar); genellikle tavsiye edilir veri iletimi için değil.

    # Two dimensional matrix
    M <- matrix(seq(1,16), 4, 4)
    
    # apply min to rows
    apply(M, 1, min)
    [1] 1 2 3 4
    
    # apply max to columns
    apply(M, 2, max)
    [1]  4  8 12 16
    
    # 3 dimensional array
    M <- array( seq(32), dim = c(4,4,2))
    
    # Apply sum across each M[*, , ] - i.e Sum across 2nd and 3rd dimension
    apply(M, 1, sum)
    # Result is one-dimensional
    [1] 120 128 136 144
    
    # Apply sum across each M[*, *, ] - i.e Sum across 3rd dimension
    apply(M, c(1,2), sum)
    # Result is two-dimensional
         [,1] [,2] [,3] [,4]
    [1,]   18   26   34   42
    [2,]   20   28   36   44
    [3,]   22   30   38   46
    [4,]   24   32   40   48
    

    Eğer satır/sütun veya 2 boyutlu bir matris için, emin olmak demektir meblağlar isterseniz araştırmak son derece optimize edilmiş, şimşek kadar hızlı colMeans, rowMeans, colSums, rowSums.

  • lapply-Bir her öğe için bir işlevi uygulamak istiyorsanız, sırayla liste ve bir liste olsun.

    Bu diğer *uygulamak çok işlev beygir. Peel kendi kodunu tekrar ve sık sık lapply altında bulacaksınız.

       x <- list(a = 1, b = 1:3, c = 10:100) 
       lapply(x, FUN = length) 
       $a 
       [1] 1
       $b 
       [1] 3
       $c 
       [1] 91
    
       lapply(x, FUN = sum) 
       $a 
       [1] 1
       $b 
       [1] 6
       $c 
       [1] 5005
    
  • sapply-Bir her öğe için bir işlevi uygulamak istiyorsanız, liste sırayla, ama seni istiyorumvektörgeri, bir liste yerine.

    Eğer varsa unlist(lapply(...)), durun ve düşünün kendinizi yazarak bulursan sapply.

       x <- list(a = 1, b = 1:3, c = 10:100)
       #Compare with above; a named vector, not a list 
       sapply(x, FUN = length)  
       a  b  c   
       1  3 91
    
       sapply(x, FUN = sum)   
       a    b    c    
       1    6 5005 
    

    sapply daha gelişmiş kullanır zorlamak için çalışacağız uygun eğer çok boyutlu bir dizi, neden. Eğer bizim işlevi, örneğin, aynı uzunlukta vektör, sapply bir matrisin sütun olarak onları kullanın

       sapply(1:5,function(x) rnorm(3,x))
    

    Eğer bizim işlevi, Eğer 2 boyutlu bir matris, 54* *aynı şey aslında, tek uzun bir vektör olarak her döndürülen matris tedavi yapacak:

       sapply(1:5,function(x) matrix(x,2,2))
    

    Biz bu durumda tek tek matrislerin çok boyutlu bir dizi oluşturmak için kullanın. ** 56, belirtmedikçe:

       sapply(1:5,function(x) matrix(x,2,2), simplify = "array")
    

    Bu davranışlar her fonksiyonu aynı uzunlukta veya boyut vektör veya matris dönen elbette şarttır.

  • vapply-sapply kullanmak istediğiniz ama gerek belki de zaman kodunuzu biraz daha hızlı sıkmak.

    vapply, temelde R ne tür bir örnek şey ver fonksiyon biraz zaman zorlanarak, iade etme, geri dönecek tek bir atomik vektör uyum sağlamak için değerler.

    x <- list(a = 1, b = 1:3, c = 10:100)
    #Note that since the advantage here is mainly speed, this
    # example is only for illustration. We're telling R that
    # everything returned by length() should be an integer of 
    # length 1. 
    vapply(x, FUN = length, FUN.VALUE = 0L) 
    a  b  c  
    1  3 91
    
  • mapply-Çeşitli veri yapıları varsa (örneğin vektörler, listeler) ve 1 elemanları için bir işlevi uygulamak istediğiniz her ve her 2 elementler, vb., sonuç uyardı sapply vektör/bir dizi gibi.

    Bu fonksiyon kabul etmek gerekir ki bu anlamda çok değişkenli. birden çok bağımsız değişken.

    #Sums the 1st elements, the 2nd elements, etc. 
    mapply(sum, 1:5, 1:5, 1:5) 
    [1]  3  6  9 12 15
    #To do rep(1,4), rep(2,3), etc.
    mapply(rep, 1:4, 4:1)   
    [[1]]
    [1] 1 1 1 1
    
    [[2]]
    [1] 2 2 2
    
    [[3]]
    [1] 3 3
    
    [[4]]
    [1] 4
    
  • Göster-Bir liste iade garantili SIMPLIFY = FALSE, mapply için bir sarıcı.

    Map(sum, 1:5, 1:5, 1:5)
    [[1]]
    [1] 3
    
    [[2]]
    [1] 6
    
    [[3]]
    [1] 9
    
    [[4]]
    [1] 12
    
    [[5]]
    [1] 15
    
  • rapply-Bir her öğe için bir işlevi uygulamak için zaman istiyorumiç içe geçmiş listesiözyinelemeli yapısı.

    Ne kadar nadir rapply hakkında bir fikir vermek için, önce bu cevabı gönderirken unuttum! Belli ki, birçok kişi bunu kullanmak, ama YMMV eminim. rapply en iyi kullanıcı tanımlı uygulamak için işlev: bir ile gösterilmiştir

    #Append ! to string, otherwise increment
    myFun <- function(x){
        if (is.character(x)){
        return(paste(x,"!",sep=""))
        }
        else{
        return(x   1)
        }
    }
    
    #A nested list structure
    l <- list(a = list(a1 = "Boo", b1 = 2, c1 = "Eeek"), 
              b = 3, c = "Yikes", 
              d = list(a2 = 1, b2 = list(a3 = "Hey", b3 = 5)))
    
    
    #Result is named vector, coerced to character           
    rapply(l,myFun)
    
    #Result is a nested list like l, with values altered
    rapply(l, myFun, how = "replace")
    
  • tapply-Bir fonksiyonu uygulamak için zaman istiyorumalt kümeleribir vektör ve alt kümeleri başka bir vektör, genellikle bir tarafından tanımlanır faktör.

    *Kara koyun ailesi, bir tür uygulamak. Yardım dosyası kullanın. ifade "bir bit olabilir confusing, ama aslında bu" düzensiz dizi oldukça basit.

    Vektör:

       x <- 1:20
    

    Bir faktör (aynı uzunlukta!) grup tanımlama:

       y <- factor(rep(letters[1:5], each = 4))
    

    Her alt grup y tarafından tanımlanan içinde x değerleri ekleyin

       tapply(x, y, sum)  
        a  b  c  d  e  
       10 26 42 58 74 
    

    Daha karmaşık örnekler, alt gruplar tanımlandığı ele alınabilir çeşitli faktörlerin bir listesini eşsiz kombinasyonu ile. tapply bu ruhu benzer Uygula-birleştirmek split fonksiyonları R (aggregate, , *, *78byave, vb.) ortak Dolayısıyla onun yüz karası durum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • Le Cargo !

    Le Cargo !

    24 HAZİRAN 2007
  • Shaollin Animes

    Shaollin Ani

    19 HAZİRAN 2013