【问题标题】:How to use row number inside apply function in R如何在R中的apply函数中使用行号
【发布时间】:2018-03-04 12:54:26
【问题描述】:

我想按如下方式处理数据帧,我想获得 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 中有效地做到这一点

【问题讨论】:

  • 预期输出是什么

标签: r


【解决方案1】:

1) rollapply 我们可以使用rollapply 形成A 的子向量矩阵,然后将其与初始列0 一起添加到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) 基础 此解决方案类似,但不使用任何包。前两行与(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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2022-03-28
    • 1970-01-01
    相关资源
    最近更新 更多