我有這樣一個數據:平均超過連續塊
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
我有這樣一個數據:平均超過連續塊
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
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
它給你的運行和值,所以你可以使用兩者。
這裏有一種方法:
## 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
,該索引因中較好的單詞而需要更改。然後,我們f
和fac
彙總:
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
啊,我明白了...... ;-)很好地使用聚合的方式。 – 2011-03-30 10:46:45
+1第一個'rle'提= = – mbq 2011-03-30 10:49:55
+1很棒的頭腦再次呃@Joris ;-) – 2011-03-30 10:44:46
是的,我忘了rle ...加爲最優雅 – mbq 2011-03-30 10:49:00