【问题标题】:convert Days in occurences in R转换 R 中出现的天数
【发布时间】:2021-12-21 06:10:35
【问题描述】:

我有一个这种形式的数据:

ID    FIRM   PAY_START    PAY_end
1      A        1         359
1      A        360       500
1      B        720       780
1      C        800       930
1      D        934       1200
2      E        1         316
2      E        320       360
3      F        1         339
3      F        340       342
3      G        345       600

我希望首先将 PAY_START(以天为单位)转换为面板 1、2、3 中的出现次数,如下所示:

ID    FIRM   PAY_START    PAY_end  Occurence
1      A        1         359      1
1      A        360       500      2
1      B        720       780      3
1      C        800       930      4
1      D        934       1200     5
2      E        1         316      1
2      E        320       360      2
3      F        1         339      1
3      F        340       342      2
3      G        345       600      3

我想计算 Pay_end 的滞后:

ID    FIRM   PAY_START    PAY_end  Occurence   Lag_Pay_end
1      A        1         359      1           0
1      A        360       500      2           141
1      B        720       780      3           280
1      C        800       930      4           150
1      D        934       1200     5           270
2      E        1         316      1           0
2      E        320       360      2           44
3      F        1         339      1           0
3      F        340       342      2           3
3      G        345       600      3           258

感谢您的帮助!

【问题讨论】:

    标签: r sorting time panel lag


    【解决方案1】:

    data.table 方法

    library(data.table)
    DT <- fread("ID    FIRM   PAY_START    PAY_end
    1      A        1         359
    1      A        360       500
    1      B        720       780
    1      C        800       930
    1      D        934       1200
    2      E        1         316
    2      E        320       360
    3      F        1         339
    3      F        340       342
    3      G        345       600")
    
    DT[, Occurence := rowid(ID)]
    DT[, Lag_Pay_end := PAY_end - shift(PAY_end, type = "lag", fill = PAY_end[1]),
       by = .(ID)]
    #    ID FIRM PAY_START PAY_end Occurence Lag_Pay_end
    # 1:  1    A         1     359         1           0
    # 2:  1    A       360     500         2         141
    # 3:  1    B       720     780         3         280
    # 4:  1    C       800     930         4         150
    # 5:  1    D       934    1200         5         270
    # 6:  2    E         1     316         1           0
    # 7:  2    E       320     360         2          44
    # 8:  3    F         1     339         1           0
    # 9:  3    F       340     342         2           3
    #10:  3    G       345     600         3         258
       
    

    【讨论】:

    • 好的,谢谢,所以我必须在使用 DT[, Occurence := rowid(ID)] 之前订购我的数据?因为在我给你的例子中,Pay_Start 是有序的,但它可以是其他的?
    • 如果您需要特定的订单,那么可以;先排序,再计算rowid()
    【解决方案2】:

    使用ave 执行分组计算。

    transform(dat, Occurence=ave(PAY_START, ID, FUN=\(x) as.numeric(as.factor(x))),
              Lag_Pay_end=ave(PAY_end, ID, FUN=\(x) c(0, diff(x))))
    #    ID FIRM PAY_START PAY_end Occurence Lag_Pay_end
    # 1   1    A         1     359         1           0
    # 2   1    A       360     500         2         141
    # 3   1    B       720     780         3         280
    # 4   1    C       800     930         4         150
    # 5   1    D       934    1200         5         270
    # 6   2    E         1     316         1           0
    # 7   2    E       320     360         2          44
    # 8   3    F         1     339         1           0
    # 9   3    F       340     342         2           3
    # 10  3    G       345     600         3         258
    

    数据:

    dat <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L), 
        FIRM = c("A", "A", "B", "C", "D", "E", "E", "F", "F", "G"
        ), PAY_START = c(1L, 360L, 720L, 800L, 934L, 1L, 320L, 1L, 
        340L, 345L), PAY_end = c(359L, 500L, 780L, 930L, 1200L, 316L, 
        360L, 339L, 342L, 600L)), class = "data.frame", row.names = c(NA, 
    -10L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-06
      • 2019-10-03
      • 1970-01-01
      • 2017-01-19
      • 2015-07-21
      • 1970-01-01
      • 2015-12-27
      相关资源
      最近更新 更多