我想将一个给定的行与数据表中的特定组中的另一行(对于此特定情况第二)中的另一个行进行比较。例如,假设我有以下数据表
>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与第二行Price2中的每一行在第二行= 0之内,这样,如果Price1:127.47至少比非非非非非非非NAS价格在第2列中(组秒= 0),然后将其创建一个以1为1的假人,否则应为0。第二= 0,它应该创建一个虚拟= 0。该过程应针对组中的每个EX进行第二= 0的ex,并且在比较Price2与Price 1的情况下适用相同至少比Price 1中的任何一排在第二= 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