我正在尝试使用以下代码将非na值传递到下一个非na值:
test3 <- data.table(final_data)
test3 <- test3[, na.locf(test3, na.rm = F, fromLast = F, maxgap = Inf), by = "gvkey"]当我不包括..。部分,部分然而,当我到达一个新的gvkey时,我需要代码停止,否则它会传递错误的公司数据。我得到了长格式(下面的例子)。正如您所看到的,如果我不使用...by =gvkey,它会将gvkey1的值传递给gvkey2,这是我想要避免的。但是,在这样做时,我会收到以下错误消息:
[.data.table中的错误(test3,,na.locf(test3,na.rm = F,fromLast = F,:负长度向量不允许)
<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>
欢迎您提出任何建议或解决方案!
发布于 2019-05-28 14:44:24
在最新的开发版本(v1.12.3)中使用data.table::nafill(),形成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有关加载开发版本的说明,请参见:https://github.com/Rdatatable/data.table/wiki/Installation。
发布于 2019-05-28 14:42:35
使用“注释”末尾可重复显示的数据,我不会收到任何错误消息:
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)https://stackoverflow.com/questions/56344520
复制相似问题