【问题标题】:Replicating a dataframe as a whole n times将一个数据帧作为一个整体复制 n 次
【发布时间】:2013-08-31 13:47:39
【问题描述】:

我试图将一个数据框(动物园对象)作为一个整体复制 50 次,并将结果作为矩阵得到,但我尝试过的所有命令似乎都不成功。我可以轻松编写一个函数来执行此操作,但我希望使用rep 可以轻松实现结果。

以以下为例

 x <- zoo(data.frame(A = c(1,2,3,4,5,6), B = c(7,8,9,10,11,12), C = c(13,14,15,16,17,18)), order.by = seq(as.Date("2012-01-01"), as.Date("2012-06-01"), by  = "month"))

 #> x
 #           A  B  C
 #2012-01-01 1  7 13
 #2012-02-01 2  8 14
 #2012-03-01 3  9 15
 #2012-04-01 4 10 16
 #2012-05-01 5 11 17
 #2012-06-01 6 12 18

让我们尝试复制x 2 次。我正在寻找的最终结果是:

 #      [,1] [,2] [,3]
 # [1,]    1    7   13
 # [2,]    2    8   14
 # [3,]    3    9   15
 # [4,]    4   10   16
 # [5,]    5   11   17
 # [6,]    6   12   18
 # [7,]    1    7   13
 # [8,]    2    8   14
 # [9,]    3    9   15
 #[10,]    4   10   16
 #[11,]    5   11   17
 #[12,]    6   12   18

这是我迄今为止尝试过的,但这些都不起作用:

 matrix(rep(x,2), ncol = 3, byrow = T)

 matrix(rep(x,2), ncol = 3, byrow = F)

 matrix(rep(x, each = 2), ncol = 3)

有人可以帮忙吗?

谢谢,

【问题讨论】:

标签: r dataframe rep


【解决方案1】:
coredata(x)[rep(seq(nrow(x)),50),]
       A  B  C
  [1,] 1  7 13
  [2,] 2  8 14
  [3,] 3  9 15
  [4,] 4 10 16
  [5,] 5 11 17
  [6,] 6 12 18
...snip...
[295,] 1  7 13
[296,] 2  8 14
[297,] 3  9 15
[298,] 4 10 16
[299,] 5 11 17
[300,] 6 12 18

【讨论】:

    【解决方案2】:
    sapply(x, rep.int, times=3)
    #      A  B  C
    # [1,] 1  7 13
    # [2,] 2  8 14
    # [3,] 3  9 15
    # [4,] 4 10 16
    # [5,] 5 11 17
    # [6,] 6 12 18
    # [7,] 1  7 13
    # [8,] 2  8 14
    # [9,] 3  9 15
    # [10,] 4 10 16
    # [11,] 5 11 17
    # [12,] 6 12 18
    # [13,] 1  7 13
    # [14,] 2  8 14
    # [15,] 3  9 15
    # [16,] 4 10 16
    # [17,] 5 11 17
    # [18,] 6 12 18
    

    【讨论】:

    • 你也应该添加as.data.frame
    【解决方案3】:

    replicate 呢?

    do.call(rbind, replicate(5, as.matrix(x), simplify=FALSE))
    

    实际上,使用我已经忘记的coredata() 会快得多(但仍不如接受的答案快)。

    do.call(rbind, replicate(5, coredata(x), simplify = FALSE))
    

    【讨论】:

      【解决方案4】:

      purrr风格

      df <- iris[1:3,]
      N <- 3
      library(tidyverse)
      reduce(seq_len(N -1), .init = df, ~bind_rows(.x, df))
      #>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
      #> 1          5.1         3.5          1.4         0.2  setosa
      #> 2          4.9         3.0          1.4         0.2  setosa
      #> 3          4.7         3.2          1.3         0.2  setosa
      #> 4          5.1         3.5          1.4         0.2  setosa
      #> 5          4.9         3.0          1.4         0.2  setosa
      #> 6          4.7         3.2          1.3         0.2  setosa
      #> 7          5.1         3.5          1.4         0.2  setosa
      #> 8          4.9         3.0          1.4         0.2  setosa
      #> 9          4.7         3.2          1.3         0.2  setosa
      

      reprex package (v2.0.0) 于 2021 年 5 月 30 日创建


      类似的baseR风格

      df <- iris[1:3,]
      N <- 3
      
      Reduce(function(.x, .y) rbind(.x, df), seq_len(N -1), init = df)
      #>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
      #> 1          5.1         3.5          1.4         0.2  setosa
      #> 2          4.9         3.0          1.4         0.2  setosa
      #> 3          4.7         3.2          1.3         0.2  setosa
      #> 4          5.1         3.5          1.4         0.2  setosa
      #> 5          4.9         3.0          1.4         0.2  setosa
      #> 6          4.7         3.2          1.3         0.2  setosa
      #> 7          5.1         3.5          1.4         0.2  setosa
      #> 8          4.9         3.0          1.4         0.2  setosa
      #> 9          4.7         3.2          1.3         0.2  setosa
      

      reprex package (v2.0.0) 于 2021-05-30 创建

      【讨论】:

        【解决方案5】:

        mapply() 函数呢?

        mapply(rep, x, 3)
        

        【讨论】:

          【解决方案6】:

          我们可以在dplyr 包中使用bind_rows(将所有数据帧组合在一个列表中),这样我们就可以避免do.call()rbind() 一起使用:

          library(dplyr)
          bind_rows(replicate(2, x, simplify = FALSE))
          

          输出:

                 A     B     C
             <dbl> <dbl> <dbl>
           1     1     7    13
           2     2     8    14
           3     3     9    15
           4     4    10    16
           5     5    11    17
           6     6    12    18
           7     1     7    13
           8     2     8    14
           9     3     9    15
          10     4    10    16
          11     5    11    17
          12     6    12    18
          

          【讨论】:

            猜你喜欢
            • 2020-05-17
            • 2016-04-19
            • 2019-08-13
            • 2016-08-16
            • 2022-12-22
            • 1970-01-01
            • 2015-09-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多