我对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)
欢迎提出任何建议! 谢谢!
答案 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