na.locf - векторы с отрицательной длиной не допускаются - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь перенести значения не-n, пока не достигну следующего значения не-n со следующим кодом:

test3 <- data.table(final_data)

test3 <- test3[, na.locf(test3, na.rm = F, fromLast = F, maxgap = Inf), by = "gvkey"]

Это работает, когда я не включаю часть ... by = gvkey. Тем не менее, мне нужно, чтобы код останавливался при достижении нового gvkey, иначе bc передаст неверные данные компании. Я получил это в длинном формате (пример ниже). Как вы можете видеть, что произойдет, если я не использую ... by = gvkey], он переносит значение gvkey1 в gvkey2, чего я хочу избежать. Но при этом я получаю следующее сообщение об ошибке:

Error in `[.data.table`(test3, , na.locf(test3, na.rm = F, fromLast = F,  : 
  negative length vectors are not allowed

<table><tbody><tr><th>date</th><th>gvkey</th><th>dlcq</th><th>dlttq</th></tr><tr><td>date1</td><td>gvkey1</td><td>10</td><td>20</td></tr><tr><td>date2</td><td>gvkey1</td><td>NA</td><td>NA</td></tr><tr><td>date3</td><td>gvkey1</td><td>NA</td><td>10</td></tr><tr><td>.</td><td> </td><td> </td><td> </td></tr><tr><td>.</td><td> </td><td> </td><td> </td></tr><tr><td>.</td><td> </td><td> </td><td> </td></tr><tr><td>date10</td><td>gvkey2</td><td>NA</td><td>NA</td></tr><tr><td>date11</td><td>gvkey2</td><td>10</td><td>NA</td></tr><tr><td>date12</td><td>gvkey2</td><td>NA</td><td>NA</td></tr></tbody></table>

Любые предложения / решения очень приветствуются!

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Использование data.table::nafill() из последней версии разработки (v1.12.3) в форме data.table

DT <- fread("date | gvkey | dlcq | dlttq
            date1 | gvkey1 | 10 | 20
            date2 | gvkey1 | NA | NA 
            date3 | gvkey1 | NA | 10 
            date10 | gvkey2 | NA | NA 
            date11 | gvkey2 | 10 | NA 
            date12 | gvkey2 | NA | NA")

cols = c("dlcq", "dlttq")
DT[, (cols) := lapply( .SD, nafill, type = "locf" ), by = gvkey, .SDcols = cols][]

#      date  gvkey dlcq dlttq
# 1:  date1 gvkey1   10    20
# 2:  date2 gvkey1   10    20
# 3:  date3 gvkey1   10    10
# 4: date10 gvkey2   NA    NA
# 5: date11 gvkey2   10    NA
# 6: date12 gvkey2   10    NA

см. Инструкции по загрузке dev-версии: https://github.com/Rdatatable/data.table/wiki/Installation.

0 голосов
/ 28 мая 2019

Используя данные, воспроизводимые в примечании в конце, я не получаю никаких сообщений об ошибках:

library(data.table)
library(zoo)

test3[, na.locf(test3, na.rm = FALSE, fromLast = FALSE, maxgap = Inf), by = "gvkey"]

давая это без ошибок, хотя это не желаемый ответ.

     gvkey   date  gvkey dlcq dlttq
 1: gvkey1  date1 gvkey1   10    20
 2: gvkey1  date2 gvkey1   10    20
 3: gvkey1  date3 gvkey1   10    10
 4: gvkey1 date10 gvkey2   10    10
 5: gvkey1 date11 gvkey2   10    10
 6: gvkey1 date12 gvkey2   10    10
 7: gvkey2  date1 gvkey1   10    20
 8: gvkey2  date2 gvkey1   10    20
 9: gvkey2  date3 gvkey1   10    10
10: gvkey2 date10 gvkey2   10    10
11: gvkey2 date11 gvkey2   10    10
12: gvkey2 date12 gvkey2   10    10

Проблема в том, что правильный способ обращения к test3 в пределах test3 заключается в использовании .SD следующим образом:

test3[, na.locf(.SD, na.rm = FALSE, fromLast = FALSE, maxgap = Inf), by = "gvkey"]

дает:

    gvkey   date dlcq dlttq
1: gvkey1  date1   10    20
2: gvkey1  date2   10    20
3: gvkey1  date3   10    10
4: gvkey2 date10   NA    NA
5: gvkey2 date11   10    NA
6: gvkey2 date12   10    NA

Примечание

Lines <- "
date | gvkey | dlcq | dlttq
date1 | gvkey1 | 10 | 20
date2 | gvkey1 | NA | NA 
date3 | gvkey1 | NA | 10 
date10 | gvkey2 | NA | NA 
date11 | gvkey2 | 10 | NA 
date12 | gvkey2 | NA | NA"


library(data.table)
test3 <- fread(Lines)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...