Я немного застрял в конкретной проблеме в R, для которой у меня есть только многословное и нелегкое решение. Может быть, кто-то знает лучший способ сделать это.
Допустим, у нас есть такой фрейм данных:
x <- c("A", "B", "C", "B", "A", "C", "C", "B", "A", "B", "A", "C")
z <- c(1, 1, 1, 2, 2, 2,3, 3, 3, 4, 4,4)
y <- c(43, 32, 45, 32, 22, 52, 23, 13, 12, 4, 12, 5)
df <- data.frame(x,z,y)
с данными, похожими на это: сюжет
Я пытаюсь вычислить разницу между значениями y в группах x в зависимости от z. Например. разница между А группы 1 и А группы 2 (43-22 = 21) и А группы 2 и А группы 3 (22-12 = 10) и так далее.
Я могу сделать это очень уродливо, как это:
ordered.df<-df[order(df$z, df$x),]
bl<-ordered.df[ordered.df$z==1,]
bl2<-ordered.df[ordered.df$z==2,]
bl3<-ordered.df[ordered.df$z==3,]
bl4<-ordered.df[ordered.df$z==4,]
first <- bl$y - bl2$y
second <- bl2$y - bl3$y
third <- bl3$y - bl4$y
ycolumn <- c(first,second,third)
xcolumn <- rep(c("A","B","C"),3)
zcolumn <- rep(1:3,each=3)
final.df <- data.frame(xcolumn,zcolumn,ycolumn)
и задавался вопросом, есть ли еще какие-нибудь элегантные и масштабируемые решения.
В конечном счете, я хочу сосчитать случаи положительных различий:
final.df$lower <- 0
final.df$lower[final.df$ycolumn>0] <- 1
aggregate(lower ~ zcolumn, final.df, sum)
Любые предложения приветствуются!
Спасибо!