数据框中的重复行

Duplicate rows in dataframe

我有一个 data.frame 看起来像这样:

df <- data.frame(id=c("001","002","003","004"),year=c(2015,2015,2015,2015),
                 x1=c(15,20,25,30),x2=c(1,2,3,4))
    
id   year   x1   x2
001  2015   15   1
002  2015   20   2
003  2015   25   3
004  2015   30   4

我想复制 idx1x2,但更改 year 以得到类似于以下内容的 data.frame :

id   year   x1   x2
001  2015   15   1
002  2015   20   2
003  2015   25   3
004  2015   30   4
001  2016   15   1
002  2016   20   2
003  2016   25   3
004  2016   30   4

我可以这样做

df2 <- df %>%
  mutate(year = 2016)

df3 <- rbind(df, df2)

但我想知道是否有更直观的方法,这样我就可以创建 20 多年的副本,而无需制作多个新的 data.frames?

df <- data.frame(id=c("001","002","003","004"),year=c(2015,2015,2015,2015),
                 x1=c(15,20,25,30),x2=c(1,2,3,4))
library(tidyr)

df %>% complete(nesting(id, x1, x2), year = 2015:2016)
#> # A tibble: 8 x 4
#>   id       x1    x2  year
#>   <chr> <dbl> <dbl> <dbl>
#> 1 001      15     1  2015
#> 2 001      15     1  2016
#> 3 002      20     2  2015
#> 4 002      20     2  2016
#> 5 003      25     3  2015
#> 6 003      25     3  2016
#> 7 004      30     4  2015
#> 8 004      30     4  2016

对于额外的年份,您只需根据需要更改 2015:2016。您也可以在此处使用动态引用 seq

library(tidyverse)
df <- data.frame(id=c("001","002","003","004"),year=c(2015,2015,2015,2015),
                 x1=c(15,20,25,30),x2=c(1,2,3,4))

map_dfr(0:1, ~mutate(df, year = year + .x))
#>    id year x1 x2
#> 1 001 2015 15  1
#> 2 002 2015 20  2
#> 3 003 2015 25  3
#> 4 004 2015 30  4
#> 5 001 2016 15  1
#> 6 002 2016 20  2
#> 7 003 2016 25  3
#> 8 004 2016 30  4

reprex package (v2.0.0)

于 2021 年 6 月 16 日创建