如何使用R中的data.table构建变更表?

时间:2018-05-15 05:30:15

标签: r data.table

鉴于以下数据:

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年的变化,我们希望显示这些变化。

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

Table of the data

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

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

然后尝试手动计算每年之间的变化。结果表就像下面的红色表一样。

Result

然而,如果有多年,程序化解决方案将更有效和更清洁。我想知道这样的事情是否可行(没有for循环)。

2 个答案:

答案 0 :(得分:2)

您应该始终使用data.table。

以长格式工作
implementation 'com.quickblox:quickblox-android-sdk-core:2.5.2@aar'
implementation('com.quickblox:quickblox-android-sdk-chat:2.5.2@aar') {
    transitive = true
    }

答案 1 :(得分:0)

我们在那里可以获得理想的价值。一个选项可能是更改回data.frame并以subtraction格式执行矩阵操作(demo)。

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))