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ış
sapply(vec, f)
: giriş vektörü. çıkış vektör elemanıi
f(vec[i])
nerede/matris [f
multi-element bir çıkış varsa, bir matris veriyorsapply
ama çıkış listesi aynı mı?lapply(vec, f)
:apply(matrix, 1/2, f)
: giriş matrisi. çıkış 28 ** element f(matrisin satır/sütun) bir vektörtapply(vector, grouping, f)
: çıktı bir matris/dizi, bir elemanı matris/dizi değerif
gruplandırmag
vektör veg
alır itti satır/sütun adlarıby(dataframe, grouping, f)
:g
bir gruplandırma olalım. grup/dataframe her sütun içinf
uygulayın. yazdırma gruplandırma ve her sütunf
değeri çok.aggregate(matrix, grouping, f)
:by
ama çıkış baskı güzel yerine, toplu bir dataframe içine her şey pislik içinde.] benzer
CEVAP
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 bulursansapply
.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ınsapply(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çindex
değerleri ekleyintapply(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
, , *, *78by
ave
, vb.) ortak Dolayısıyla onun yüz karası durum.
Nasıl bir toplu iş dosyası geçerli diz...
Öz-kapanış XHTML büyük tarayıcılar tar...
Geçerli Parça bir ViewPager tarafından...
Android Studio tarafından sağlanan jav...
Bir toplu iş dosyası içinde geçerli di...