沿非方块对角线的部分行总和
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
必须使用 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