我想按如下方式处理数据帧,其中我想获得2个向量的总和,并将其作为行向量附加到数据帧。 2个向量是考虑行和列向量的行向量,它们在具有固定长度的考虑行的正下方开始。
data
A b1 b2 b3
1 2 2 2
2 3 3 3
3 4 4 4
4 5 5 5
5 6 6 6
output (expected)
A b1 b2 b3
1 4 5 6
2 6 7 8
3 8 9 -
4 10 - -
5 - - -
在示例中,如果考虑第一行,则两个向量
row vector r- [2 2 2]
column vector c - [2,3,4]
在获得列向量的转置后,我可以添加两个向量并将其附加到新的数据框。必须对所有行执行此过程。
最简单的方法是循环,但在R循环中效率不高,可以使用apply
函数。但是在这种情况下,要做到这一点需要知道当前行号是什么。
有没有办法在R
中有效地做到这一点答案 0 :(得分:0)
1)rollapply 我们可以使用rollapply
来构建A
的子向量矩阵,然后将其与初始列零一起添加到m
。请注意,我们使用NA值填充A
,以便rollapply
的结果为适当的形状。
library(zoo)
m <- cbind(A = 1:5, b1 = 2:6, b2 = 2:6, b3 = 2:6) # input matrix
nc1 <- ncol(m) - 1
A <- c(m[, 1], rep(NA, nc1))
cbind(0, rollapply(A[-1], nc1, c)) + m
,并提供:
A b1 b2 b3
[1,] 1 4 5 6
[2,] 2 6 7 8
[3,] 3 8 9 NA
[4,] 4 10 NA NA
[5,] 5 NA NA NA
2)base 此解决方案类似,但不使用任何包。前两行与(1)中的相同。
nc1 <- ncol(m) - 1
A <- c(m[, 1], rep(NA, nc1))
cbind(0, embed(A[-1], nc1)[, seq(nc1, 1)]) + m
,并提供:
A b1 b2 b3
[1,] 1 4 5 6
[2,] 2 6 7 8
[3,] 3 8 9 NA
[4,] 4 10 NA NA
[5,] 5 NA NA NA