我试图将数据帧(zoo对象)作为一个整体复制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)
OR
matrix(rep(x,2), ncol = 3, byrow = F)
OR
matrix(rep(x, each = 2), ncol = 3)
有人可以帮忙吗?
谢谢,
答案 0 :(得分:13)
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
答案 1 :(得分:11)
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
答案 2 :(得分:5)
replicate
怎么样?
do.call(rbind, replicate(5, as.matrix(x), simplify=FALSE))
实际上,更快(但仍然没有接受的答案那么快)就是利用我忘记的coredata()
。
do.call(rbind, replicate(5, coredata(x), simplify = FALSE))
答案 3 :(得分:1)
mapply() 函数呢?
mapply(rep, x, 3)
答案 4 :(得分:1)
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 年 5 月 30 日创建
答案 5 :(得分:0)
我们可以在 bind_rows
包中使用 dplyr
(组合列表中的所有数据帧),因此我们可以避免将 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