在data.table中使用先前计算的值

时间:2018-12-06 07:49:12

标签: r data.table

MWE中的x.wanted使用在上一行计算的x.wanted,然后添加实际行中的值。如何在data.table中完成?我以为shift是这样,但是给出了错误的结果。

x.wanted是一种在图形中分隔条宽不同的条的方法。

library(data.table)
library(ggplot2)
dt <- data.table(x.group=c(rep(1L, 4L), rep(2L, 5L)),
                 x.width=c(2L, 4L, 2L, 6L, 4L, 2L, 4L, 6L, 2L),
                 x.sep=c(0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L),
                 x.wanted=c(1, 5, 9, 14, 2, 6, 10, 16, 21))

dt[, x.try.1:=x.width/2]
dt[, x.try.1:=shift(x=x.try.1, fill=0, type="lag") + x.sep + x.width/2, by=x.group]

p <- ggplot(dt, aes(x=x.wanted, y=5))
p <- p + geom_bar(aes(width=x.width), stat="identity", position="stack")
p <- p + facet_grid(x.group~., scales="free_x")
p

已添加图以可视化所需结果。 x.try.1是我失败的尝试。

enter image description here

1 个答案:

答案 0 :(得分:2)

如果我理解正确,则OP希望找到条形图的中点。这可以通过使用cumsum()函数(加上shift())来实现:

dt[, x.mid := cumsum(shift(x.width, fill = 0) + x.sep) + x.width/2, by = x.group][]
   x.group x.width x.sep x.wanted x.try.1 x.mid
1:       1       2     0        1       1     1
2:       1       4     1        5       4     5
3:       1       2     1        9       4     9
4:       1       6     1       14       5    14
5:       2       4     0        2       2     2
6:       2       2     1        6       4     6
7:       2       4     1       10       4    10
8:       2       6     1       16       6    16
9:       2       2     1       21       5    21

x.mid的计算值与OP的x.wanted一致。


另一种方法是绘制矩形而不是条形图。恕我直言,这将使用x轴上的左右角点,从而使计算更加简单:

dt[, x.min := cumsum(shift(x.width, fill = 0) + x.sep), by = x.group]

ggplot(dt, aes(xmin = x.min, xmax = x.min + x.width, ymin = 0, ymax = 5)) +
  geom_rect() +
  facet_grid(x.group ~ .)

这将创建与OP的问题相同的图表。