代码之家  ›  专栏  ›  技术社区  ›  Gabriel

数据表do日期为R的差分运算

  •  1
  • Gabriel  · 技术社区  · 7 年前

    嗨,我在数据中有一个数据集。表格格式。我们将此dtA称为:

    Date    Company    Data
    200012    compA       3
    200012    compB       4
    200012    compC       7
    200101    compA       1
    200101    compB       2
    200101    compC       3
    200102    compA       2
    200102    compB       4
    200102    compC       1
    

    我想为每个日期,每个公司做,我想在两者之间做减法。

    因此,最终结果将是:

    Date    Company    Data
    200102    compA       1
    200102    compB       2
    200102    compC      -2
    200101    compA      -2
    200101    compB      -2
    200101    compC      -4
    

    为此,我编写了一个冗长而庞大的代码,我是否可以在数据中使用lappy函数。桌子 我似乎不明白lapply是如何用于内部数据的。桌子当Lappy中没有迭代器时,我无法循环遍历日期。。。

    这是我的代码:

    date=as.data.table(c("200012","200101", "200102"))
    comp=as.data.table(c("compA","compB","compC"))
    result=NA
    date=date[-order(date)] #so it go decenting order
    
    for (i in 1:(nrow(date)-1)){
        d1=date[i]
        d2=date[i+1]
    
    
        dtA1=dtA[Date==d1][order(Company)]
        dtA2=dtA[Date==d2][order(Company)]
        ans.temp=merge(dtA1,dtA2, on=c("Date","Company"))
        ans.temp=ans.temp[,Data := Data.x - Data.y, by="Company"]
        ans.temp=ans.temp[,-c(3,4,5)]
    
    
        if (is.NA(result)[1]){
            result=ans.temp
        } else{
            result=rbind(result, ans.temp)
        }
    
    } 
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Gregor Thomas    7 年前

    您不需要循环或应用程序,只需使用 diff 公司集团:

    setkey(dtA, Date, Company)
    dtA[, list(diff = diff(Data), Date = Date[-1]), by = Company]
    #    Company diff   Date
    # 1:   compA   -2 200101
    # 2:   compA    1 200102
    # 3:   compB   -2 200101
    # 4:   compB    2 200102
    # 5:   compC   -4 200101
    # 6:   compC   -2 200102
    

    使用此数据:

    dtA = fread("Date    Company    Data
    200012    compA       3
    200012    compB       4
    200012    compC       7
    200101    compA       1
    200101    compB       2
    200101    compC       3
    200102    compA       2
    200102    compB       4
    200102    compC       1")