每个月重复一个数据框

时间:2019-05-15 10:59:33

标签: r duplicates

我有此数据:

  month shop product
1     1    1       2
2     1    1       3
3     1    2       4
4     1    3       4
5     1    4       5

我想在接下来的12个月内重复该操作。由于数据集有5行,因此复制后必须有60行。

所以它必须看起来像这样:

  month shop product
1     1    1       2
2     1    1       3
3     1    2       4
4     1    3       4
5     1    4       5
6     2    1       2
7     2    1       3
8     2    2       4
9     2    3       4
10    2    4       5
11    3    1       2
...

我尝试使用expand.grid

d_expand = expand.grid(month = c(1:12), shop = d$shop, product = d$product)

但是我得到了300行,因为使用了每种组合。

library(dplyr)

glimpse(d_expand)

Observations: 300
Variables: 3
$ month   <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7,...
$ shop    <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
$ product <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,...

是否有可能扩展数据集,以便仅复制实际出现在数据中的那些组合。

dput(d)
structure(list(month = c(1, 1, 1, 1, 1), shop = c(1, 1, 2, 3, 
4), product = c(2, 3, 4, 4, 5)), class = "data.frame", row.names = c(NA, 
-5L))

2 个答案:

答案 0 :(得分:3)

你可以做

data.frame(month = rep(1:12, each = 5), shop = rep(d$shop, 12), 
           product = rep(d$product, 12))


#   month shop product
#1      1    1       2
#2      1    1       3
#3      1    2       4
#4      1    3       4
#5      1    4       5
#6      2    1       2
#7      2    1       3
#8      2    2       4
#9      2    3       4
#10     2    4       5
#11     3    1       2
#.....

或者,如果您有更多的列数,并且不想手动键入每一列,那么一般的解决方案是忽略month列并每行重复12次,并使用回收技术来填充{{1 }} month中的列

1:12

我们也可以使用cbind(month = 1:12, d[rep(seq_len(nrow(d)), each = 12), -1])

tidyr::crossing

答案 1 :(得分:1)

我们可以使用complete

library(tidyverse)
complete(d, month = 1:12, nesting(shop, product))
# A tibble: 60 x 3
#   month  shop product
#   <dbl> <dbl>   <dbl>
# 1     1     1       2
# 2     1     1       3
# 3     1     2       4
# 4     1     3       4
# 5     1     4       5
# 6     2     1       2
# 7     2     1       3
# 8     2     2       4
# 9     2     3       4
#10     2     4       5
# … with 50 more rows

另一个选项是expand.grid,但是用行序列而不是列创建一个data.frame

d1 <-  expand.grid(month = 1:12, rn = seq_len(nrow(d)))

,然后使用“ rn”进行索引

cbind(d1['month'], d[-1][d1$rn,])