2011-03-30 92 views
5

我有這樣一個數據:平均超過連續塊

f x 
A 1.1 
A 2.2 
A 3.3 
B 3.5 
B 3.7 
B 3.9 
B 4.1 
B 4.5 
A 5.1 
A 5.2 
C 5.4 
C 5.5 
C 6.1 
B 6.2 
B 6.3 

我想平均x超過f連續塊,得到這個,類似tapply(...,mean),但知道的事實,這不該」牛逼混合分離塊,而在原來的順序:

f x 
A 2.2 
B 3.94 
A 5.15 
C 5.67 
B 6.25 

回答

5

rle是一個可能性:

> id <- rle(as.character(Data$f)) 
> Means <-tapply(Data$x,rep(1:length(id$lengths),id$lengths),mean)  
> data.frame(Means,f=id$values) 
    Means f 
1 2.200000 A 
2 3.940000 B 
3 5.150000 A 
4 5.666667 C 
5 6.250000 B 

它給你的運行和值,所以你可以使用兩者。

+0

+1很棒的頭腦再次呃@Joris ;-) – 2011-03-30 10:44:46

+0

是的,我忘了rle ...加爲最優雅 – mbq 2011-03-30 10:49:00

6

這裏有一種方法:

## reproducible code for example 
dat <- read.table(foo <- textConnection("f x 
A 1.1 
A 2.2 
A 3.3 
B 3.5 
B 3.7 
B 3.9 
B 4.1 
B 4.5 
A 5.1 
A 5.2 
C 5.4 
C 5.5 
C 6.1 
B 6.2 
B 6.3 
"), header = TRUE) 
close(foo) 

我們使用rle()來計算f的運行長度,並創建一個新因子fac,該索引因中較好的單詞而需要更改。然後,我們ffac彙總:

lens <- with(dat, rle(as.character(f))) 
dat$fac <- with(lens, factor(rep(seq_along(lengths), times = lengths))) 
aggregate(x ~ f + fac, data = dat, FUN = mean) 

,並提供:

> aggregate(x ~ f + fac, data = dat, FUN = mean) 
    f fac  x 
1 A 1 2.200000 
2 B 2 3.940000 
3 A 3 5.150000 
4 C 4 5.666667 
5 B 5 6.250000 

我們可以很容易地刪除第二列fac的結果,如果這是不可取:

> aggregate(x ~ f + fac, data = dat, FUN = mean)[,-2] 
    f  x 
1 A 2.200000 
2 B 3.940000 
3 A 5.150000 
4 C 5.666667 
5 B 6.250000 
+0

啊,我明白了...... ;-)很好地使用聚合的方式。 – 2011-03-30 10:46:45

+0

+1第一個'rle'提= = – mbq 2011-03-30 10:49:55