Сопоставление двух данных с разным количеством строк в цикле - PullRequest
0 голосов
/ 29 декабря 2018

Я думаю, что мою проблему не сложно решить без моих данных.Я хотел бы выполнить для этого цикл в R вместо того, чтобы делать это вручную, поскольку ответ не всегда состоит из 34 итераций, он может быть более или менее.

«Цена» фрейма данных абсолютно огромна (около 4 миллионов)строк на 20 столбцов), но не изменяется.

price

Фрейм данных "ihbm_hf" намного меньше, 34 строки на 20 столбцов, но ИЗМЕНИТСЯ на основе другого вычисления.

ihbm_hf

Идентификатором для обоих информационных кадров является GVKEY, но я хочу только сохранить данные в цене для GVKEY, содержащиеся в «ihbm_hf», и сохранить эти данные в phbm_hfm1

Это задача, которую я хочу выполнить автоматически.

 phbm_hf1 <- price[which(ihbm_hf$gvkey[1] == price$gvkey),]
    phbm_hf2 <- price[which(ihbm_hf$gvkey[2] == price$gvkey),]
    phbm_hf3 <- price[which(ihbm_hf$gvkey[3] == price$gvkey),]
    phbm_hf4 <- price[which(ihbm_hf$gvkey[4] == price$gvkey),]
    phbm_hf5 <- price[which(ihbm_hf$gvkey[5] == price$gvkey),]
    phbm_hf6 <- price[which(ihbm_hf$gvkey[6] == price$gvkey),]
    phbm_hf7 <- price[which(ihbm_hf$gvkey[7] == price$gvkey),]
    phbm_hf8 <- price[which(ihbm_hf$gvkey[8] == price$gvkey),]
    phbm_hf9 <- price[which(ihbm_hf$gvkey[9] == price$gvkey),]
    phbm_hf10 <- price[which(ihbm_hf$gvkey[10] == price$gvkey),]
    phbm_hf11 <- price[which(ihbm_hf$gvkey[11] == price$gvkey),]
    phbm_hf12 <- price[which(ihbm_hf$gvkey[12] == price$gvkey),]
    phbm_hf13 <- price[which(ihbm_hf$gvkey[13] == price$gvkey),]
    phbm_hf14 <- price[which(ihbm_hf$gvkey[14] == price$gvkey),]
    phbm_hf15 <- price[which(ihbm_hf$gvkey[15] == price$gvkey),]
    phbm_hf16 <- price[which(ihbm_hf$gvkey[16] == price$gvkey),]
    phbm_hf17 <- price[which(ihbm_hf$gvkey[17] == price$gvkey),]
    phbm_hf18 <- price[which(ihbm_hf$gvkey[18] == price$gvkey),]
    phbm_hf19 <- price[which(ihbm_hf$gvkey[19] == price$gvkey),]
    phbm_hf20 <- price[which(ihbm_hf$gvkey[20] == price$gvkey),]
    phbm_hf21 <- price[which(ihbm_hf$gvkey[21] == price$gvkey),]
    phbm_hf22 <- price[which(ihbm_hf$gvkey[22] == price$gvkey),]
    phbm_hf23 <- price[which(ihbm_hf$gvkey[23] == price$gvkey),]
    phbm_hf24 <- price[which(ihbm_hf$gvkey[24] == price$gvkey),]
    phbm_hf25 <- price[which(ihbm_hf$gvkey[25] == price$gvkey),]
    phbm_hf26 <- price[which(ihbm_hf$gvkey[26] == price$gvkey),]
    phbm_hf27 <- price[which(ihbm_hf$gvkey[27] == price$gvkey),]
    phbm_hf28 <- price[which(ihbm_hf$gvkey[28] == price$gvkey),]
    phbm_hf29 <- price[which(ihbm_hf$gvkey[29] == price$gvkey),]
    phbm_hf30 <- price[which(ihbm_hf$gvkey[30] == price$gvkey),]
    phbm_hf31 <- price[which(ihbm_hf$gvkey[31] == price$gvkey),]
    phbm_hf32 <- price[which(ihbm_hf$gvkey[32] == price$gvkey),]
    phbm_hf33 <- price[which(ihbm_hf$gvkey[33] == price$gvkey),]
    phbm_hf34 <- price[which(ihbm_hf$gvkey[34] == price$gvkey),]

    phbm_hf <- rbind(phbm_hf1, phbm_hf2, phbm_hf3, phbm_hf4, 
               phbm_hf5, phbm_hf6, phbm_hf7, phbm_hf8, 
               phbm_hf9, phbm_hf10, phbm_hf11, phbm_hf12, 
               phbm_hf13, phbm_hf14, phbm_hf15, phbm_hf16, 
               phbm_hf17, phbm_hf18, phbm_hf19, phbm_hf20, 
               phbm_hf21, phbm_hf22, phbm_hf23, phbm_hf24, 
               phbm_hf25, phbm_hf26, phbm_hf27, phbm_hf28,
               phbm_hf29, phbm_hf30, phbm_hf31, phbm_hf32,
               phbm_hf33, phbm_hf34)

В результате получается 98 369 строк на 20 столбцов.

phbm_hf

Это именно то, что я хотел.Но так как количество строк, содержащихся в ihbm_hf, не всегда равно 34, я не могу использовать этот код, он работал, потому что я знаю, что длина ihbm_hf на тот момент была 34.

####since the length can be longer or shorter than 34    
l <- length(ihbm_hf$gvkey)

for(i in 1:l){

  phbm_hf  <- price[which(ihbm_hf$gvkey[i] == price$gvkey),]

  }

Проблема с этим кодомявляется то, что он сохранил в phbm_hf только последнее наблюдение (34-е наблюдения), и я понятия не имею, как я могу сохранить их, как я делаю это вручную, в длинном коде внутри цикла.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Есть много разных способов сделать это, но я укажу быстрое решение для вашего решения.Проблема с вашим циклом заключается в том, что вы продолжаете обновлять / перезаписывать одну и ту же переменную (phbn_hf) при каждой итерации цикла.Вам нужно будет сохранить результат отдельно.Один путь будет в векторе, например:

l <- length(ihbm_hf$gvkey)
phbn_hf <- rep(NA, l) # creates a vector of length l

for(i in 1:l){

   phbm_hf[i] <- price[which(ihbm_hf$gvkey[i] == price$gvkey),]

}
0 голосов
/ 29 декабря 2018

Вы можете сделать:

library(data.table)

# convert to data table format for speed
setDT(price)
setDT(ihbm_hf)

# filter price data
phbm_hf = price[GVKEY %in% ihbm_hf$GVKEY]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...