我有此数据:
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))
答案 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,])