相关疑难解决方法(0)

在R data.table计算中使用上一行中的值

我想在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?
Run Code Online (Sandbox Code Playgroud)

应该是正确的答案

> 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
Run Code Online (Sandbox Code Playgroud)

r data.table

72
推荐指数
5
解决办法
6万
查看次数

在 R 的 data.table 中 foverlap 的一次迭代中查找所有重叠

我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我提出一些有关矢量化此程序的想法吗?

使用 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)) …
Run Code Online (Sandbox Code Playgroud)

r data.table

3
推荐指数
1
解决办法
797
查看次数

将data.table聚合到原始值的间隔行

我有一些data.table数量列如下:

n = 1e5
set.seed(1)

dt <- data.table(id = 1:n, amount = pmax(0,rnorm(n, mean = 5e3, sd = 1e4)))
Run Code Online (Sandbox Code Playgroud)

并给出了一个断点矢量:

breaks <- as.vector( c(0, t(sapply(c(1, 2.5, 5, 7.5), function(x) x * 10^(1:4))) ) )
Run Code Online (Sandbox Code Playgroud)

对于这些中断定义的每个间隔,我想使用data.table语法:

  1. 得到amount包含的数量
  2. 获得amount等于或大于左边界的计数(基本上n * (1-cdf(amount))

对于1,这主要起作用,但不返回空间隔的行:

dt[, .N, keyby = breaks[findInterval(amount,breaks)] ] #would prefer to get 0 for empty intvl
Run Code Online (Sandbox Code Playgroud)

对于2,我试过:

dt[, sum(amount >= thresh[.GRP]), keyby = breaks[findInterval(amount,breaks)]  ]
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为sum仅限于集团内部,而不是超出.因此提出了一个解决方法,它也返回空间隔:

dt[, cbind(breaks, sapply(breaks, function(x) sum(amount …
Run Code Online (Sandbox Code Playgroud)

r data.table

2
推荐指数
1
解决办法
247
查看次数

标签 统计

data.table ×3

r ×3