2012-01-26 1 views
1

Рассмотрим следующие данные в длинном форматеd * слойные резюмировать, где порядок имеет значение

library(plyr) 
library(reshape2) 

x <- seq(0,2*pi,length=20) 
ll <- ll2 <- list(a = data.frame(x=x, y=sin(x)), 
        b = data.frame(x=x, y=cos(x))) 

m <- melt(ll, id="x") 
m2 <- m[sample(nrow(m)),] 

head(m) 
#   x variable  value L1 
# 0.0000000  y 0.0000000 a 
# 0.3306940  y 0.3246995 a 
# 0.6613879  y 0.6142127 a 
# 0.9920819  y 0.8371665 a 
# 1.3227759  y 0.9694003 a 
# 1.6534698  y 0.9965845 a 

m$L1 красиво заказал, но m2$L1 это повсюду. Теперь, начиная с такого рода данных, я хочу получить разницу value[L1 == "b"] - value[L1 == "a"] за каждое значение x. Следующие строки иллюстрируют проблему использования diff, когда m2$L1 не упорядочен: знак может быть неправильным. Есть ли трюк, который я мог бы использовать для достижения результата последних двух вызовов ddply, но более элегантно?

res <- ddply(m, "x", summarize, difference = diff(value)) 
res <- ddply(m2, "x", summarize, difference = diff(value)) # fails, because L1 not ordered 
res <- ddply(m2[order(m2$L1, m2$x), ], "x", summarize, difference = diff(value)) 
res <- ddply(m2, "x", function(d) 
      data.frame(difference = d$value[d$L1 == "b"] - d$value[d$L1 == "a"])) 

plot(res) # visual check of the result 
lines(x, cos(x) - sin(x) , col="red") 

ответ

3

dcast делать то, что вы хотите?

transform( 
    dcast(m2, x + variable ~ L1), 
    difference = b - a 
) 
+0

Да, это, вероятно, лучший способ. К сожалению, я почти никогда не получаю формулу правильно. – baptiste

 Смежные вопросы

  • Нет связанных вопросов^_^