Есть ли способ сравнить одну данную строку в таблице данных с другими строками в группе? - PullRequest
0 голосов
/ 19 февраля 2019

Я хотел бы сравнить одну данную строку с каждой отдельной строкой в ​​другом столбце в пределах определенной группы (для этого конкретного второго секунды) в таблице данных.Например, предположим, у меня есть следующая таблица данных

>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))

Я хотел бы сравнить первую строку в столбце PRICE1 в группе second = 0 и EX = 1 с каждой отдельной строкой в ​​столбце PRICE2 в течение second = 0, так что если PRICE1: 127.47 больше, по крайней мере, один раз, чем цена без NA в столбце 2 (внутри группы second = 0), то он должен создать фиктив со значением 1, в противном случае следует принять значение 0. В этомВ этом случае ни в коем случае это условие не выполняется, поэтому для EX1 во втором = 0 следует создать фиктивную = 0.Эту процедуру следует выполнить для каждого EX в секундах группы = 0. И то же самое применяется, когда дело доходит до сравнения PRICE2 с PRICE1, но в этом случае условие меняется на противоположное, так что если PRICE2 для одного данного EX в течение секунды = 0 нижепо крайней мере, один раз, чем любая строка в PRICE1 в течение секунды = 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, а затем сравнить его построчно.Это решение потребляет много памяти, что мне не нужно, поскольку таблица данных может достигать даже 9 миллионов наблюдений.

Спасибо!

1 Ответ

0 голосов
/ 19 февраля 2019

Не могу сказать, что действительно понял ваши "правила";Ваш формат данных очень странный, и я бы рекомендовал сделать шаг назад и переосмыслить первый, потому что для меня это звучит как 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      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...