R 和对角线左下到右上

R sum diagonal left down to right top

我有一个关于从左下到右上对角线求和的问题。

这是数据 (dt):

dt
     date       1       2       3         4
1: 2016-01-01  47   562358   2881713  6062886
2: 2016-02-01  37   667633   2868784  6033143
3: 2016-03-01 130   546816   2292909  5092588
4: 2016-04-01  60   453094   2277252  5276752

str(dt)
Classes ‘data.table’ and 'data.frame':  4 obs. of  5 variables:
 $ date  : chr  "2016-01-01" "2016-02-01" "2016-03-01" "2016-04-01" 
 $ 1     : num  47 37 130 60
 $ 2     : num  562358 667633 546816 453094 
 $ 3     : num  2881713 2868784 2292909 2277252 
 $ 4     : num  6062886 6033143 5092588 5276752 

我想要的是这样创建:

NDate        Value
2016-01-01    47
2016-02-01    562395
2016-03-01    3549476
2016-04-01    8007158
2016-05-01    8779146
2016-06-01    7369840
2016-07-01    5276752

NDatedate 加上栏号的月份。例如:NDate == 2016-02-01,它的Value就是562395,也就是37 + 562358

我该怎么办?

1) 可以将 i,j 索引的两列矩阵传递给数据框以获得这些值,因此:

library(data.table)

Sum <- function(i, d) sum(as.data.frame(d)[-1][cbind(1:i, i:1)])
dt[, list(date, Value = sapply(1:.N, Sum, .SD))]

给予:

         date   Value
1: 2016-01-01      47
2: 2016-02-01  562395
3: 2016-03-01 3549476
4: 2016-04-01 9478546

2) 省略 date 行号 + 列号在反对角线上是常量所以:

mat <- as.matrix(dt)[, -1]
values <- tapply(mat, row(mat) + col(mat), sum)
data.table(date = as.Date(dt$date[1]) + seq_along(values) - 1, values = values)

给予:

         date  values
1: 2016-01-01      47
2: 2016-01-02  562395
3: 2016-01-03 3549476
4: 2016-01-04 9478546
5: 2016-01-05 8779146
6: 2016-01-06 7369840
7: 2016-01-07 5276752

备注

可重现形式的输入是:

Lines <- "date       1       2       3         4
2016-01-01  47   562358   2881713  6062886
2016-02-01  37   667633   2868784  6033143
2016-03-01 130   546816   2292909  5092588
2016-04-01  60   453094   2277252  5276752"

library(data.table)
dt <- fread(Lines, header = TRUE)