Рассмотрим следующие данные в длинном формате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")
Да, это, вероятно, лучший способ. К сожалению, я почти никогда не получаю формулу правильно. – baptiste