有什么方法可以将数据表中的给定行与具有组的其他行进行比较?

时间:2019-02-19 11:47:48

标签: r data.table compare row

我想将给定的行与数据表中特定组(对于此特定情况为秒)中另一列中的每一行进行比较。例如,假设我有以下数据表

>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万次观察。

谢谢!

1 个答案:

答案 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