沿非方块对角线的部分行总和

Partial row sums along non-square block diagonal

必须使用 dplyr 或 sapply(seq....?

来解决这个问题

我想在我的数据框中创建一个部分行总和的列向量,例如,前 3 行将对前 2 列求和,接下来的 3 行将对接下来的 2 列求和,等等.

因此,例如使用这个随机生成的数据集:

df <- data.frame(replicate(expr=rnorm(9),n = 6))

X1 X2 X3 X4 X5 X6
0.1964241 0.03964263 -0.01284166 0.2151990 -0.07765504 -0.92258542
1.7902662 -0.63973304 -0.25093688 -1.6119364 0.82503876 0.40736909
0.5831977 2.03465322 -0.96911364 -2.9498718 1.12056903 0.26401143
0.6503336 -0.55889760 -0.30331195 1.8801063 -0.12216360 0.09128355
1.2450301 -0.35577941 -0.65526714 0.7572617 1.94533708 -0.68068743
0.1611066 1.32441739 0.85744732 0.6347286 0.98836270 -0.23196950
0.7254907 -0.02062223 -0.29098358 -2.2365083 1.22438538 1.98511178
-0.2744802 1.16812643 -0.08278120 0.6771291 -0.31511761 -0.92915936
0.1248361 -0.60735712 -0.82784469 0.5198143 -0.13112286 -0.40609023

我将有一个简单的命令,我将仅返回前三行的前两列的行总和向量,仅返回接下来三行的中间两列,以及最后两列仅最后三行的列。

这就是我正在寻找的输出:

New vector
0.2360667
1.1505332
2.6178509
1.5767943
0.1019946
1.4921759
3.2094972
-1.2442770
-0.5372131

将这种东西应用于大型数据框最直接的命令是什么?我想我可以将数据帧转换为矩阵并提取非方块对角线,如果关闭对角线为 0,那么我可以只进行正常的行总和,但是对角线包中的 fatdiag 命令 -- fatdiag(df , size = c(3,2)) -- returns 出现以下错误:

Error in 1:steps : argument of length 0
In addition: Warning messages:
1: In split_vector(1:dx[1], steps = steps) :
  Both steps and size parameters are NULL, setting step size to 1 (one). 
2: In split_vector(1:dx[2], steps = steps) :
  Both steps and size parameters are NULL, setting step size to 1 (one).

拆分两次:按列然后按行,然后照常 rowSums

sapply(split.default(df, rep(1:3, each = 2)), function(i){
  sapply(split(i, gl(nrow(df)/3, 3)), function(j){
    rowSums(j)
  })
})

#               1          2           3
# [1,]  0.2360667  0.2023573 -1.00024046
# [2,]  1.1505332 -1.8628733  1.23240785
# [3,]  2.6178509 -3.9189854  1.38458046
# [4,]  0.0914360  1.5767944 -0.03088005
# [5,]  0.8892507  0.1019946  1.26464965
# [6,]  1.4855240  1.4921759  0.75639320
# [7,]  0.7048685 -2.5274919  3.20949716
# [8,]  0.8936462  0.5943479 -1.24427697
# [9,] -0.4825210 -0.3080304 -0.53721309

我们可以用unlist转换成向量

这是一种解决方法:

n <- 3 # Number of rows to be considered
p <- 2 # Number of columns to sum
A <- list(matrix(1, n, p))
B <- as.matrix(Matrix::bdiag(rep(A,nrow(df)/n)))
rowSums(df * B)

[1]  0.2360667  1.1505332  2.6178509  1.5767944  0.1019946  1.4921759
[7]  3.2094972 -1.2442770 -0.5372131