【问题标题】:How to construct a table of changes using data.table in R?如何使用 R 中的 data.table 构建更改表?
【发布时间】:2018-10-24 20:33:54
【问题描述】:

给定以下数据:

library(data.table)

demo <- data.table(ID = c("A", "A", "A", "A","A", "B", "B","B", "C","C","C", "D",
                  "D"),
           Year = c(2011, 2012, 2013, 2014, 2015, 
                    2012, 2013, 2015,
                    2013, 2014, 2015,
                    2013, 2015))

我们可以清楚地看到,对于 A 的 ID,它似乎不会随着时间的推移而改变,因此不应注册任何更改。 但是对于 B 的 ID,我们看到了 2011 年到 2012 年、2013 年到 2014 年和 2014 年到 2015 年的变化,我们想展示这些变化。

此数据的清晰图片如下所示。

现在,要在 R 中构造它,我实际上可以执行以下操作:

demo[, Value := 1]
dcast(demo, ID ~ Year, value.var = "Value", fill = 0)

然后尝试手动计算每年之间的变化。生成的表格将类似于下面的红色表格。

但是,如果有很多年,程序化解决方案会更高效、更简洁。我想知道这样的事情是否可能(没有 for 循环)。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们很乐意获得所需的价值。一个选项可能是改回 data.frame 并以宽格式对 demo 执行矩阵运算 (subtraction)。

    library(data.table)
    demo[, Value := 1]
    DT <- dcast(demo, ID ~ Year, value.var = "Value", fill = 0) 
    # change back to data.frame to use matrix operation
    setDF(DT)
    
    #matrix operation with a column shift
    cbind(DT[1], DT[,3:6] - DT[,2:5])
    #   ID 2012 2013 2014 2015
    # 1  A    0    0    0    0
    # 2  B    1    0   -1    1
    # 3  C    0    1    0    0
    # 4  D    0    1   -1    1
    

    数据:

    library(data.table)
    
    demo <- data.table(ID = c("A", "A", "A", "A","A", "B", "B","B", "C","C","C", "D",
                      "D"),
               Year = c(2011, 2012, 2013, 2014, 2015, 
                        2012, 2013, 2015,
                        2013, 2014, 2015,
                        2013, 2015))
    

    【讨论】:

      【解决方案2】:

      您应该始终使用 data.table 以长格式工作。

      demo[, val := 1]
      #add missing years for IDs:
      demo <- demo[CJ(ID = unique(ID), Year = unique(Year)), on = .(ID, Year)]
      demo[is.na(val), val := 0L]
      #calculate differences:
      demo <- demo[, .(Years = paste(head(Year, -1), tail(Year, -1), sep = "-"),
               Diff = diff(val)), by = ID]
      dcast(demo, ID ~ Years)
      #   ID 2011-2012 2012-2013 2013-2014 2014-2015
      #1:  A         0         0         0         0
      #2:  B         1         0        -1         1
      #3:  C         0         1         0         0
      #4:  D         0         1        -1         1
      

      【讨论】:

        猜你喜欢
        • 2015-07-28
        • 2013-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 2021-08-31
        • 1970-01-01
        相关资源
        最近更新 更多