使用添加列重复data.frame N次

时间:2017-09-06 19:38:59

标签: r dataframe

我有以下数据框,我想重复N次

dc <- read.table(text = "from    1    2    3    4    5
    1 0.01 0.02 0.03 0.04 0.05
    2 0.06 0.07 0.08 0.09 0.10
    3 0.11 0.12 0.13 0.14 0.15
    4 0.16 0.17 0.18 0.19 0.20
    5 0.21 0.22 0.23 0.24 0.25", header = TRUE)

n<-20    
ddr <- NA

for(i in 1:n) {
  ddr <- rbind(ddr, cbind(dc,i))
}

结果,我想收到:

from   X1   X2   X3   X4   X5  i
1 0.01 0.02 0.03 0.04 0.05  1
2 0.06 0.07 0.08 0.09 0.10  1
3 0.11 0.12 0.13 0.14 0.15  1
4 0.16 0.17 0.18 0.19 0.20  1
5 0.21 0.22 0.23 0.24 0.25  1
1 0.01 0.02 0.03 0.04 0.05  2
2 0.06 0.07 0.08 0.09 0.10  2
3 0.11 0.12 0.13 0.14 0.15  2
4 0.16 0.17 0.18 0.19 0.20  2
5 0.21 0.22 0.23 0.24 0.25  2
.............................
1 0.01 0.02 0.03 0.04 0.05 20
2 0.06 0.07 0.08 0.09 0.10 20
3 0.11 0.12 0.13 0.14 0.15 20
4 0.16 0.17 0.18 0.19 0.20 20
5 0.21 0.22 0.23 0.24 0.25 20

矩阵必须重复N次,并添加重复次数。

这个问题是否有正确的解决方案(在R中执行此操作的简单功能)?在我的情况下,如果未声明ddr(ddr&lt; -NA),则脚本不起作用。谢谢!

2 个答案:

答案 0 :(得分:6)

您可以使用rep()复制行索引,也可以创建重复数字列。

cbind(dc[rep(1:nrow(dc), n), ], i = rep(1:n, each = nrow(dc)))

让我们分解一下:

  • dc[rep(1:nrow(dc), n), ]i的行[值的rep(1:n, each = nrow(dc))值中使用复制的行索引
  • n复制一个序列nrow(dc)值的长度cbind(...)
  • cbind(dc, i = rep(1:n, each = nrow(dc))) 将两者合并为一个数据框

正如@HubertL在评论中指出的那样,这可以进一步简化为

{{1}}
感谢回收的神奇之处。请给他投票。

答案 1 :(得分:4)

这也是一种更直观的方式,速度与其他最佳答案相同:

n <- 3
data.frame(df,i=rep(1:n,ea=NROW(df)))

输出(重复3次):

   from   X1   X2   X3   X4   X5 i
1     1 0.01 0.02 0.03 0.04 0.05 1
2     2 0.06 0.07 0.08 0.09 0.10 1
3     3 0.11 0.12 0.13 0.14 0.15 1
4     4 0.16 0.17 0.18 0.19 0.20 1
5     5 0.21 0.22 0.23 0.24 0.25 1
6     1 0.01 0.02 0.03 0.04 0.05 2
7     2 0.06 0.07 0.08 0.09 0.10 2
8     3 0.11 0.12 0.13 0.14 0.15 2
9     4 0.16 0.17 0.18 0.19 0.20 2
10    5 0.21 0.22 0.23 0.24 0.25 2
11    1 0.01 0.02 0.03 0.04 0.05 3
12    2 0.06 0.07 0.08 0.09 0.10 3
13    3 0.11 0.12 0.13 0.14 0.15 3
14    4 0.16 0.17 0.18 0.19 0.20 3
15    5 0.21 0.22 0.23 0.24 0.25 3

编辑:热门答案速度测试

该测试按比例放大至n = 1e + 05,迭代= 100:

func1 <- function(){
  data.frame(df,i=rep(1:n,ea=NROW(df)))
}

func2 <- function(){
  cbind(dc, i = rep(1:n, each = nrow(dc)))
}

func3 <- function(){
  cbind(dc[rep(1:nrow(dc), n), ], i = rep(1:n, each = nrow(dc)))
}

microbenchmark::microbenchmark(
  func1(),func2(),func3())

Unit: milliseconds
  expr       min        lq      mean    median        uq      max neval cld
 func1()  15.58709  21.69143  28.62695  22.01692  23.85648 117.9012   100  a 
 func2()  15.99023  21.59375  28.37328  22.18298  23.99953 136.1209   100  a 
 func3() 414.18741 436.51732 473.14571 453.26099 498.21576 666.8515   100   b