2012-05-18 27 views
13

Bir veri çerçevesindeki gruplar için (a) ve "b") kümülatif toplamını (v) elde etmeye çalışıyorum. Sonuç, alt satırdaki - satırları düzgün bir şekilde numaralandırılmış şekilde - nasıl veri alabilirim?Bir data.frame içindeki gruplara bir işlev uygulayın R

> library(nlme) 
> g <- factor(c("a","b","a","b","a","b","a","b","a","b","a","b")) 
> v <- c(1,4,1,4,1,4,2,8,2,8,2,8) 
> cs <- rep(0,12) 
> d <- data.frame(g,v,cs) 

> d 
    g v cs 
1 a 1 0 
2 b 4 0 
3 a 1 0 
4 b 4 0 
5 a 1 0 
6 b 4 0 
7 a 2 0 
8 b 8 0 
9 a 2 0 
10 b 8 0 
11 a 2 0 
12 b 8 0 

> r=gapply(d,FUN="cumsum",form=~g, which="v") 
>r 

$a  
    v 
1 1 
3 2 
5 3 
7 5 
9 7 
11 9 

$b  
    v 
2 4 
4 8 
6 12 
8 20 
10 28 
12 36 

> str(r) 
List of 2 
$ a:'data.frame': 6 obs. of 1 variable: 
    ..$ v: num [1:6] 1 2 3 5 7 9 
$ b:'data.frame': 6 obs. of 1 variable: 
    ..$ v: num [1:6] 4 8 12 20 28 36 

ben d $ cs içine bu dataframes verileri almak için bazı zahmetli yol bulurum sanırım, ama ben eksik bazı kolay çimdik olmak için orada var.

cevap

10
ı kullanmak

giden oldukça garip canavar

split(d$cs, d$g) <- lapply(split(d$v, d$g), cumsum) 

olduğunu ave. ave kaynağına bakarsanız, esasen Martin Morgan'ın solution dosyasını tamamladığını görürsünüz.

R> g <- factor(c("a","b","a","b","a","b","a","b","a","b","a","b")) 
R> v <- c(1,4,1,4,1,4,2,8,2,8,2,8) 
R> d <- data.frame(g,v) 
R> d$cs <- ave(v, g, FUN=cumsum) 
R> d 
    g v cs 
1 a 1 1 
2 b 4 4 
3 a 1 2 
4 b 4 8 
5 a 1 3 
6 b 4 12 
7 a 2 5 
8 b 8 20 
9 a 2 7 
10 b 8 28 
11 a 2 9 
12 b 8 36 
+0

Her zaman ave'yi unutuyorum; Yine de diğer ikisi de aynı şekilde mi geliyor? –

+0

@TylerRinker: esas olarak Martin'in çözümü ile aynı (benim düzenlememe bakın). –

+0

Kafam karıştı b/c Ben joran ile karşılaştırıldı. Plyr'in işleri yeniden düzenlediğini unuttum. +1 –

7

bunlar için seçim Benim alet plyr paketidir:

require(plyr) 
> ddply(d,.(g),transform,cs = cumsum(v)) 
    g v cs 
1 a 1 1 
2 a 1 2 
3 a 1 3 
4 a 2 5 
5 a 2 7 
6 a 2 9 
7 b 4 4 
8 b 4 8 
9 b 4 12 
10 b 8 20 
11 b 8 28 
12 b 8 36 
13

split<-

> d 
    g v cs 
1 a 1 1 
2 b 4 4 
3 a 1 2 
4 b 4 8 
5 a 1 3 
6 b 4 12 
7 a 2 5 
8 b 8 20 
9 a 2 7 
10 b 8 28 
11 a 2 9 
12 b 8 36 
+3

ilk veriyi sipariş vardı -. Default'. Var olduğunu fark etmedim (ya da ave'nin temeli idi.) 'Split <-. Data.frame' bile gariptir. –

0
> library(nlme) 
> g <- factor(c("a","b","a","b","a","b","a","b","a","b","a","b")) 
> v <- c(1,4,1,4,1,4,2,8,2,8,2,8) 
> cs <- rep(0,12) 
> d <- data.frame(g,v,cs) 
> d <- d[order(d$g),] 
> temp <- by(d$v,d$g,cumsum) 
> d$cs <- do.call("c",temp) 
> d 
    g v cs 
1 a 1 1 
3 a 1 2 
5 a 1 3 
7 a 2 5 
9 a 2 7 
11 a 2 9 
2 b 4 4 
4 b 4 8 
6 b 4 12 
8 b 8 20 
10 b 8 28 
12 b 8 36 

fonksiyonu ile kullanılarak başka bir çözüm, ama `

İlgili konular