[英]Compare item in one row against all other rows and loop through all rows using data.table - R
[英]Is there any way to compare one given row in a data table with other rows withing a group?
我想将一个给定的行与数据表中特定组内的另一列中的每一行(对于这个特定情况第二个)进行比较。 例如假设我有以下数据表
>dt<- data.table(bSIDE = c(0,0,0,0,1,1,1,1,0,0),
EX = c(1,3,9,14,1,3,5,14,1,2),
second=c(0,0,0,0,0,0,0,0,1,1),
PRICE1=c(NA,NA,NA,NA,127.47,127.47,127.47,127.47,NA,NA),
PRICE2=c(127.49,127.48,127.58,127.46,NA,NA,NA,NA,127.48,127.48))
我想将组 second=0 和 EX=1 中 PRICE1 列中的第一行与 second=0 内 PRICE2 列中的每一行进行比较,这样如果 PRICE1: 127.47 比非 NAs 中的价格至少大一次第 2 列(在组 second=0 内),那么它应该创建一个值为 1 的虚拟对象,否则应该取值为 0。在这种情况下,这个条件永远不会被填充,所以对于秒内的 EX1=0 ,它应该创建一个 dummy=0。 应该对组 second=0 中的每个 EX 执行此过程。当将 PRICE2 与 PRICE1 进行比较时,同样适用,但在这种情况下,条件相反,如果 second=0 内给定 EX 的 PRICE2 较低至少比 PRICE1 中的任何行在 second=0 内创建一次,否则它应该创建一个值为 1 和 0 的虚拟对象。 因此,我想得到以下内容:
> objective<- data.table(bSIDE = c(0,0,0,0,1,1,1,1,0,0),
EX = c(1,3,9,14,1,3,5,14,1,2),
second=c(0,0,0,0,0,0,0,0,1,1),
PRICE1=c(NA,NA,NA,NA,127.47,127.47,127.47,127.47,NA,NA),
PRICE2=c(127.49,127.48,127.58,127.46,NA,NA,NA,NA,127.48,127.48),
dPRICE1=c(NA, NA, NA, NA, 0, 0, 0, 0, NA, NA),
dPRICE2=c(0,0,0,1, NA, NA, NA, NA, NA, NA)
)
我对这个问题有一个潜在的解决方案,但它在内存方面非常“昂贵”。 解决方案是为 bSIDE 组中的每个交换创建一列,然后逐行比较。 这个解决方案消耗了大量内存,我不希望这样,因为数据表可能会达到 900 万个观察值。
谢谢!
我不能说我真的理解你的“规则”; 您的数据格式非常奇怪,我建议退后一步重新考虑前者,因为这对我来说听起来像是XY 问题。 您的数据不知何故具有混合的长宽数据格式。
除此之外,以下内容重现了您的预期输出。 我并没有声称这可以概括您的更大问题,但也许它会让您开始。
dt[, `:=`(
dPRICE1 = +(first(PRICE2[EX == 1 & !is.na(PRICE2)]) < PRICE1),
dPRICE2 = +(first(PRICE1[EX == 1 & !is.na(PRICE1)]) > PRICE2)),
by = second]
# bSIDE EX second PRICE1 PRICE2 dPRICE1 dPRICE2
# 1: 0 1 0 NA 127.49 NA 0
# 2: 0 3 0 NA 127.48 NA 0
# 3: 0 9 0 NA 127.58 NA 0
# 4: 0 14 0 NA 127.46 NA 1
# 5: 1 1 0 127.47 NA 0 NA
# 6: 1 3 0 127.47 NA 0 NA
# 7: 1 5 0 127.47 NA 0 NA
# 8: 1 14 0 127.47 NA 0 NA
# 9: 0 1 1 NA 127.48 NA NA
#10: 0 2 1 NA 127.48 NA NA
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.