我想将给定的行与数据表中特定组(对于此特定情况为秒)中另一列中的每一行进行比较。例如,假设我有以下数据表
>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中的second = 0,它应该创建一个哑元= 0。应该对组秒= 0内的每个EX执行此过程。将PRICE2与PRICE1进行比较时也是如此,但是在这种情况下,条件是相反的,因此如果秒0内给定EX的PRICE2较低在秒数= 0内,PRICE1中的任何行至少要创建一次,否则它将创建一个虚拟值,取值为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万次观察。
谢谢!
答案 0 :(得分:1)
我不能说我真的了解你的“规则”;您的数据格式非常奇怪,我建议您退后一步,重新思考前一种方法,因为这听起来像XY problem。您的数据以某种方式混合了长而宽的数据格式。
此外,以下内容再现了您的预期输出。我并不是说这会笼罩您更大的问题,但是也许它可以帮助您入门。
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