【问题标题】:na.locf - Negative length vectors are not allowedna.locf - 不允许负长度向量
【发布时间】:2019-10-14 02:51:00
【问题描述】:

我正在尝试使用以下代码结转非 na 值,直到到达下一个非 na:

test3 <- data.table(final_data)

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

当我不包含 ... by = gvkey] 部分时,它可以工作。 但是,我需要在到达新的 gvkey 时停止代码,否则它将携带错误的公司数据。我得到了长格式(下面的例子)。如您所见,如果我不使用 ...by = gvkey] 会发生什么,它将 gvkey1 的值传递给 gvkey2,这是我想避免的。但是这样做时,我收到以下错误消息:

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

&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;date&lt;/th&gt;&lt;th&gt;gvkey&lt;/th&gt;&lt;th&gt;dlcq&lt;/th&gt;&lt;th&gt;dlttq&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;date1&lt;/td&gt;&lt;td&gt;gvkey1&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;date2&lt;/td&gt;&lt;td&gt;gvkey1&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;date3&lt;/td&gt;&lt;td&gt;gvkey1&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;.&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;.&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;.&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;date10&lt;/td&gt;&lt;td&gt;gvkey2&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;date11&lt;/td&gt;&lt;td&gt;gvkey2&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;date12&lt;/td&gt;&lt;td&gt;gvkey2&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

非常欢迎任何建议/解决方案!

【问题讨论】:

    标签: r


    【解决方案1】:

    使用最后注释中可重复显示的数据,我没有收到任何错误消息:

    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)
    

    【讨论】:

    • 可能是因为可能有组只有一个NA 条目?我的意思是只有一个条目,那就是 NA
    • 已扩展答案。
    • 谢谢!我试过 test3[, na.locf(.SD, na.rm = FALSE, fromLast = FALSE, maxgap = Inf), by = "gvkey"] 并没有给我错误消息。我必须仔细检查,因为我的集合有大约 9000 万行,但看起来不错。
    【解决方案2】:

    使用来自最新开发版本 (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

    【讨论】:

      猜你喜欢
      • 2018-02-08
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2022-07-19
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多