非方块对角线上的部分行求和

4

有没有用dplyr或者>等工具简单实现的解决方法?我想在数据框中创建一个列向量,该向量将沿着部分行总和的方向进行计算。例如,前3行将跨越前两列求和,下3行将跨越下两列求和,以此类推。

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

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
我希望能够得到一个简单的命令,该命令可以返回以下输出:对于前三行只包括前两列的行和接下来三行只包括中间两列的行以及最后三行只包括最后两列的行,获取这些行的行总和向量。
要将此类操作应用于大型数据框,最直接的方法是将数据框转换为矩阵,并提取非方形块对角线。如果偏离对角线为0,则可以进行常规行求和。但是,使用diagonals软件包中的fatdiag命令(fatdiag(df, size = c(3,2))时会返回错误。请问如何解决?
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).

嗨@curiouskid78,欢迎来到SO!只是一个小提醒。为了使您的代码完全可重现,您应该在示例开头使用以下函数指示种子的值:set.seed(number_of_your_choice)。干杯。 - lovalery
2个回答

4

以下是一种处理方法:

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

0

先按列再按行分割两次,然后像往常一样使用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将其转换为向量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接