计算属于一个组的多个值之间的差

时间:2019-03-12 17:25:06

标签: r

我对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)

数据如下:plot

我试图根据z计算x分组中y值之间的差。例如。第1组的A和第2组的A(43-22 = 21)与第2组的A和第3组的A(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)

欢迎提出任何建议! 谢谢!

1 个答案:

答案 0 :(得分:2)

这里是data.table一线纸

setDT(df)[, list(z = z, y_diff = y - shift(y, 1, type = "lead")), by = .(x = x)][ y_diff > 0, list(lower = .N), by = "z"]

#   z lower
#1: 1     1
#2: 2     3
#3: 3     2

它的作用:
setDT(df)
df

中创建数据表

[, list(z = z, y_diff = y - shift(y, 1, type = "lead")), by = .(x = x)]
按x分组,从当前y中减去下一个y,并创建结果为

的列y_diff

[ y_diff > 0, list(lower = .N), by = "z"]
对于y_diff大于0的所有行,给出行数(= .N,按z

分组