непрерывные подгруппы с ddply

Я хотел бы обобщать свои экспериментальные данные каждый раз, когда условие изменяется.

Например:

> df=data.frame(tos=1:9, temp=rep(c(25,50,25), each=3), response=c(3.2,3.3,3.3, 6.5, 6.5, 6.5, 3.5,3.6,3.5))
> df
    time temp response
1   1   25      3.2
2   2   25      3.3
3   3   25      3.3
4   4   50      6.5
5   5   50      6.5
6   6   50      6.5
7   7   25      3.5
8   8   25      3.6
9   9   25      3.5

Я хотел бы резюмировать это таким образом:

temp response.mean
25      3.3
50      6.5
25      3.5

Если использовать ddply следующим образом:

библиотека(plyr)
ddply(df, c("temp"), суммировать, reponse.mean=mean(response)

вывод:

  temp response.mean
1   25           3.4
2   50           6.5

Есть ли способ сделать это?


person Johan    schedule 26.04.2011    source источник


Ответы (1)


Вот один из способов сделать это

# find how many observations in each experiment
tmp1    = rle(df$temp)$lengths

# create a column referring to experiment number
df$expt = rep(1:length(tmp1), tmp1)

# compute means for each combination of temp and expt
ddply(df, .(expt, temp), summarize, response.mean = mean(response))

Это производит вывод

   expt temp response.mean
1    1   25      3.266667
2    2   50      6.500000
3    3   25      3.533333
person Ramnath    schedule 26.04.2011
comment
Переверните expt и temp в вызове ddply, чтобы результат отсортировался в правильном порядке. Кроме этого, потрясающий ответ. - person Joshua Ulrich; 26.04.2011
comment
@Джошуа. спасибо за предложение. я перевернул expt и temp и обновил вывод - person Ramnath; 26.04.2011
comment
Не могу насытиться rle. :) - person Roman Luštrik; 26.04.2011
comment
Я только начал писать ответ с rle и тут увидел твой ответ! =) rle снова приходит на помощь! В любом случае, вам действительно нужно использовать ddply? Вместо этого вы можете использовать tapply: with(df, tapply(response, expt, mean)) для получения средств и извлечения $values вектора из rle объекта. - person aL3xa; 26.04.2011
comment
@aL3xa. да, вы можете использовать tapply. я использую команды plyr, так как считаю их концептуально более элегантными и простыми для понимания. - person Ramnath; 26.04.2011
comment
Я абсолютно согласен - я также использую plyr, потому что это просто, но иногда вы не хотите, чтобы ваш код зависел от внешних пакетов. Блин, если бы посылки @hadley были в базе R... =) - person aL3xa; 26.04.2011