Усреднение по непрерывным блокам - PullRequest
5 голосов
/ 30 марта 2011

У меня есть такие данные:

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

Ответы [ 2 ]

6 голосов
/ 30 марта 2011

Вот один из способов:

## 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. Затем мы агрегируем по 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
5 голосов
/ 30 марта 2011

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

Это дает вам прогоны и значения, так что вы можете использовать оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...