使用位置规范将数据帧中的行复制n次

时间:2019-07-05 16:07:57

标签: r dataframe

样本df:

iris_subset <- iris[1:5, ]

  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          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa

我正在寻找最好的解决方案,在其中我可以复制特定的行n次,并有机会说明在何处插入重复的行。

例如,我想在原始行之后重复2行两次。

所需的输出:

  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.9         3.0          1.4         0.2  setosa
4          4.9         3.0          1.4         0.2  setosa
5          4.7         3.2          1.3         0.2  setosa
6          4.6         3.1          1.5         0.2  setosa
7          5.0         3.6          1.4         0.2  setosa

我可以草率地做类似的事情:

iris_subset <- rbind(iris_subset, iris[2,], iris[2,])
iris_subset <- iris_subset[c(1:2, 6:7, 3:5),]
row.names(iris_subset) <- 1:nrow(iris_subset)

但是,如果要对此进行功能化,则与在rbind或其他替代方式中手动传入附加参数n次相比,我需要一种更好的方法来重复要复制的行,这效率极低。

2 个答案:

答案 0 :(得分:2)

row_ind = 2
repeat_n = 3
place_at_row = 3
inds = append(x = 1:NROW(iris_subset),
          values = rep(row_ind, repeat_n),
          after = place_at_row - 1)
iris_subset[inds,]
#    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
#2.1          4.9         3.0          1.4         0.2  setosa
#2.2          4.9         3.0          1.4         0.2  setosa
#2.3          4.9         3.0          1.4         0.2  setosa
#3            4.7         3.2          1.3         0.2  setosa
#4            4.6         3.1          1.5         0.2  setosa
#5            5.0         3.6          1.4         0.2  setosa

答案 1 :(得分:1)

我们可以使用add_row中的tidyverse

library(tidyverse)
add_row(iris_subset, !!! as.list(iris_subset[rep(2, each = 3),]), .after = 2)
#  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.9         3.0          1.4         0.2  setosa
#4          4.9         3.0          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          4.6         3.1          1.5         0.2  setosa
#8          5.0         3.6          1.4         0.2  setosa