gpt4 book ai didi

r - data.table 中行的条件操作和扩展也考虑了没有 for 循环的先前扩展

转载 作者:行者123 更新时间:2023-12-04 11:39:17 24 4
gpt4 key购买 nike

假设我有两个 data.tables:

A <- data.table(
idx = c(1,2,3),
leftbound = c(1,134,1546),
rightbound = c(65, 180, 1670),
infA = c("infA1", "infA2", "infA3")
)

A
idx leftbound rightbound infA
1: 1 1 65 infA1
2: 2 134 180 infA2
3: 3 1546 1670 infA3




B <- data.table(
breakpoint = c(150, 165, 1555),
infB = c("infB1", "infB2", "infB3")
)

B

breakpoint infB
1: 150 infB1
2: 165 infB2
3: 1555 infB3

在 data.table A 中,每一行对应一个从左到右边界的范围。它有一个索引( idx )列、一个左右边界列( leftboundrightbound )和一个附加变量( infA )。
Data.table B 包括应该作为断点插入到第一个表中的边界的点。所以例如第 2 行中从 134 到 180 的范围应拆分为 150 和 165。因此,该范围应拆分为三个范围:134 - 150、150 - 165 和 165 到 180。对于这三个范围中的每一个,都应该有一个新行代替旧的“未拆分”。

因此输出应如下所示:
Output
peak.grp lb ub infA infB
1: 1 1 65 infA1 infB1
2: 2 134 150 infA2 infB2
3: 2 150 165 infA2 infB2
4: 2 165 180 infA2 infB2
5: 3 1546 1555 infA3 infB3
6: 3 1555 1670 infA3 infB3

有没有办法在没有 for 循环的情况下实现这一目标?

最佳答案

与@Alexis 相同,但矢量化而不是 lapply超过断点:

res <- B[A, on=.(breakpoint >= leftbound, breakpoint <= rightbound), {
v = c(i.leftbound, head(x.breakpoint, .N), i.rightbound)
n = c(i.infA, head(x.infB, .N), i.infA)
.(idx = idx, lb = head(v, -1), rb = tail(v, -1), ln = head(n, -1), rn = tail(n, -1))
}, by=.EACHI][, (1:2) := NULL][]

idx lb rb ln rn
1: 1 1 65 infA1 infA1
2: 2 134 150 infA2 infB1
3: 2 150 165 infB1 infB2
4: 2 165 180 infB2 infA2
5: 3 1546 1555 infA3 infB3
6: 3 1555 1670 infB3 infA3

我正在使用 head(var, .N)如果因为找不到匹配而用 NA 填充变量(但我们仍然会有 .N == 0 ,所以 head(var, .N) 的长度为零)。我想 if (.N) var也可以工作,而且可能更具可读性。

相关: https://github.com/Rdatatable/data.table/issues/3452

关于r - data.table 中行的条件操作和扩展也考虑了没有 for 循环的先前扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57526710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com