2011-10-12 28 views
10

Birisi daha şık bir çözüm olup olmadığını görmek istedim. Ancak geçerli dizini uygularken geçerli dizinin izlenmesinin uygun yolu nedir? Örneğin, SADECE toplamı vektörümün sonuna doğru değerlendirdiğim mevcut elemandan almak istediğimi varsayalım.Geçerli dizini takip ederken geçerlidir

Bunu yapmanın en iyi yolu bu mu?

y = rep(1,100) 
apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])}) 

Girişinizi takdir ediyorum.

cevap

8

Bu daha sapply için bir görev gibi görünüyor: (cumsum kullanarak daha sonra vektör y ters ve benzeri) diğer seçenekler yükler vardır özel Örneğin

sapply(seq_along(y), function(x){sum(y[x:length(y)])}) 

ama bu genel olduğunu tahmin desen: seq_along veya en kötü seq kullanın ve ilgilendiğiniz diziyi almak için *apply geçirin.

+1

Tartışılan sorunun açıklığa kavuşturulması için sadece bir soru: Bir indeks ihtiyacı varsa bir döngü daha pratik değil midir? Yoksa buradaki noktayı kaçırıyor muyum? – ROLO

+2

@ROLO: '' apply' işlev ailesinin tipik olarak, sonuçlar için çok makul bir bellek kullanımı sağlaması ve bunları basit bir şekilde "basit" olan (bu basit örneklerle açık olmayan) pratik bir biçimde saklar. Tarihsel olarak, “normal” döngülerden çok daha hızlı olmaları için de kullanılırdı, ama bu artık doğru değil. Yani, basit durumlar için, çok önemli değil. –

+0

Cümle öneri için +1 – Thierry

3

rev(cumsum(y)) geçerli örneğinde çok daha hızlı olacaktır: örneğin biraz talihsiz olmuş olabilir

> y = rep(1,100000) 
> system.time(apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])})) 
    user system elapsed 
88.108 88.639 176.094 
> system.time(rev(cumsum(y))) 
    user system elapsed 
    0.002 0.001 0.004 
0

Eh, ama soru nasıl bir dizin hakkında bilgi edinmek için "uygulamak" fonksiyonu ya da "sapply" yanıtsız kalır. Dış değişkenler (teşekkürler Stephan) başvurmak için hile - bakmak isteyebilirsiniz

şey "< <" rağmen, ben de mutsuzum

x <- 0 
l <- 1:10; names(l) <- letters[l] 
sapply(l,function(Y) { 
    x <<- x+1 
    a<-sum(x:length(l)) 
    cat("I am at ",names(l)[x]," valued ",a,".\n",sep="") 
    return(a) 
}) 

olduğunu. Özellikle paralel olarak çalışırken, semantiğin bir şekilde açıkça belirtilmesini isteyerek indeks ya da x/y pozisyonunu özlü olarak ya da uygulayabilirsiniz. Daha iyi fikirler en çok hoş karşılanır.

İlgili konular