我想在data.table中创建一个新列,该列根据一列的当前值和另一列的前一列计算得出.是否可以访问以前的行?
例如:
> DT <- data.table(A=1:5, B=1:5*10, C=1:5*100)
> DT
   A  B   C
1: 1 10 100
2: 2 20 200
3: 3 30 300
4: 4 40 400
5: 5 50 500
> DT[, D := C + BPreviousRow] # What is the correct code here?
应该是正确的答案
> DT
   A  B   C   D
1: 1 10 100  NA
2: 2 20 200 210
3: 3 30 300 320
4: 4 40 400 430
5: 5 50 500 540
我正在尝试使用 data.table 在 R 中合并一堆重叠的时间段。我接到了一个电话,要求自己对桌子进行 foverlap,这已经足够高效了。
我的问题是这样的:说 A 期与 B 期重叠,B 期与 C 期重叠,但 A 与 C 不重叠。在这种情况下,A 不与 C 分组,它们最终必须合并。
目前我有一个 while 循环查找重叠和合并,直到不再发生合并,但这并不是完全可扩展的。我可以看到的一个解决方案是将组的索引递归地应用于自身直到稳定,但这看起来仍然需要一个循环,我想要一个完全矢量化的解决方案。
dt = data.table(start = c(1,2,4,6,8,10),
                end   = c(2,3,6,8,10,12))
setkeyv(dt,c("start","end"))
f = foverlaps(dt,
              dt,
              type="any",
              mult="first",
              which="TRUE")
#Needs to return [1,1,3,3,3,3]
print(f)
#1 1 3 3 4 5
print(f[f])
#1 1 3 3 3 4
print(f[f][f])
#1 1 3 3 3 3
任何人都可以帮助我提出一些有关矢量化此程序的想法吗?
使用 ID 进行编辑:
dt = data.table(id = c('A','A','A','A','A','B','B','B'),
                eventStart = c(1,2,4,6,8,10,11,15),
                eventEnd   = c(2,3,6,8,10,12,14,16)) …我有一些data.table数量列如下:
n = 1e5
set.seed(1)
dt <- data.table(id = 1:n, amount = pmax(0,rnorm(n, mean = 5e3, sd = 1e4)))
并给出了一个断点矢量:
breaks <- as.vector( c(0, t(sapply(c(1, 2.5, 5, 7.5), function(x) x * 10^(1:4))) ) )
对于这些中断定义的每个间隔,我想使用data.table语法:
amount包含的数量amount等于或大于左边界的计数(基本上n * (1-cdf(amount))对于1,这主要起作用,但不返回空间隔的行:
dt[, .N, keyby = breaks[findInterval(amount,breaks)] ] #would prefer to get 0 for empty intvl
对于2,我试过:
dt[, sum(amount >= thresh[.GRP]), keyby = breaks[findInterval(amount,breaks)]  ]
但它不起作用,因为sum仅限于集团内部,而不是超出.因此提出了一个解决方法,它也返回空间隔:
dt[, cbind(breaks, sapply(breaks, function(x) sum(amount …