Скопируйте группы в отдельные таблицы, используя сложное условие в R - PullRequest
0 голосов
/ 10 января 2019

dput () пример

structure(list(Data = structure(c(1L, 5L, 9L, 13L, 17L, 21L, 
25L, 29L, 33L, 37L, 41L, 45L, 2L, 6L, 10L, 14L, 18L, 22L, 26L, 
30L, 34L, 38L, 42L, 46L, 3L, 7L, 11L, 15L, 19L, 23L, 27L, 31L, 
35L, 39L, 43L, 47L, 4L, 8L, 12L, 16L, 20L, 24L, 28L, 32L, 36L, 
40L, 44L, 48L, 1L, 5L, 9L, 13L), .Label = c("01.01.2015", "01.01.2016", 
"01.01.2017", "01.01.2018", "01.02.2015", "01.02.2016", "01.02.2017", 
"01.02.2018", "01.03.2015", "01.03.2016", "01.03.2017", "01.03.2018", 
"01.04.2015", "01.04.2016", "01.04.2017", "01.04.2018", "01.05.2015", 
"01.05.2016", "01.05.2017", "01.05.2018", "01.06.2015", "01.06.2016", 
"01.06.2017", "01.06.2018", "01.07.2015", "01.07.2016", "01.07.2017", 
"01.07.2018", "01.08.2015", "01.08.2016", "01.08.2017", "01.08.2018", 
"01.09.2015", "01.09.2016", "01.09.2017", "01.09.2018", "01.10.2015", 
"01.10.2016", "01.10.2017", "01.10.2018", "01.11.2015", "01.11.2016", 
"01.11.2017", "01.11.2018", "01.12.2015", "01.12.2016", "01.12.2017", 
"01.12.2018"), class = "factor"), product_id = structure(c(2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 
1L, 1L, 1L), .Label = c("w", "x"), class = "factor"), shop_code = structure(c(2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 
1L, 1L, 1L), .Label = c("e", "y"), class = "factor"), Sales = c(318L, 
345L, 503L, 264L, 266L, 265L, 231L, 333L, 376L, 232L, 197L, 952L, 
375L, 252L, 267L, 176L, 181L, 236L, 208L, 185L, 196L, 201L, 207L, 
275L, 116L, 125L, 242L, 136L, 193L, 219L, 183L, 219L, 194L, 204L, 
191L, 251L, 4L, 9L, 9L, 3L, 7L, 11L, 8L, 5L, 5L, 5L, 11L, 7L, 
318L, 345L, 503L, 264L)), .Names = c("Data", "product_id", "shop_code", 
"Sales"), class = "data.frame", row.names = c(NA, -52L))

Мне нужны группы, для которых есть все наблюдения по месяцам, скопированные в отдельный фрейм данных. Здесь у нас есть группа product_id + shop_code x+y и 4 года 2015-2018 (48 месяцев они имеют значение). Эти данные из этого набора данных должны быть скопированы в newtable

Также в этом наборе данных у нас есть группа product_id + shop_code w+e Эта группа имеет только четыре наблюдения, и такие группы должны скопировать в incompletetable

Как это сделать?

Ожидаемый вывод новых таблиц

newtable=structure(list(Data = structure(c(1L, 5L, 9L, 13L, 17L, 21L, 
25L, 29L, 33L, 37L, 41L, 45L, 2L, 6L, 10L, 14L, 18L, 22L, 26L, 
30L, 34L, 38L, 42L, 46L, 3L, 7L, 11L, 15L, 19L, 23L, 27L, 31L, 
35L, 39L, 43L, 47L, 4L, 8L, 12L, 16L, 20L, 24L, 28L, 32L, 36L, 
40L, 44L, 48L), .Label = c("01.01.2015", "01.01.2016", "01.01.2017", 
"01.01.2018", "01.02.2015", "01.02.2016", "01.02.2017", "01.02.2018", 
"01.03.2015", "01.03.2016", "01.03.2017", "01.03.2018", "01.04.2015", 
"01.04.2016", "01.04.2017", "01.04.2018", "01.05.2015", "01.05.2016", 
"01.05.2017", "01.05.2018", "01.06.2015", "01.06.2016", "01.06.2017", 
"01.06.2018", "01.07.2015", "01.07.2016", "01.07.2017", "01.07.2018", 
"01.08.2015", "01.08.2016", "01.08.2017", "01.08.2018", "01.09.2015", 
"01.09.2016", "01.09.2017", "01.09.2018", "01.10.2015", "01.10.2016", 
"01.10.2017", "01.10.2018", "01.11.2015", "01.11.2016", "01.11.2017", 
"01.11.2018", "01.12.2015", "01.12.2016", "01.12.2017", "01.12.2018"
), class = "factor"), product_id = structure(c(1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "x", class = "factor"), 
    shop_code = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "y", class = "factor"), 
    Sales = c(318L, 345L, 503L, 264L, 266L, 265L, 231L, 333L, 
    376L, 232L, 197L, 952L, 375L, 252L, 267L, 176L, 181L, 236L, 
    208L, 185L, 196L, 201L, 207L, 275L, 116L, 125L, 242L, 136L, 
    193L, 219L, 183L, 219L, 194L, 204L, 191L, 251L, 4L, 9L, 9L, 
    3L, 7L, 11L, 8L, 5L, 5L, 5L, 11L, 7L)), .Names = c("Data", 
"product_id", "shop_code", "Sales"), class = "data.frame", row.names = c(NA, 
-48L))

ожидаемый результат

incompletetable=structure(list(Data = structure(1:4, .Label = c("01.01.2015", 
"01.02.2015", "01.03.2015", "01.04.2015"), class = "factor"), 
    product_id = structure(c(1L, 1L, 1L, 1L), .Label = "w", class = "factor"), 
    shop_code = structure(c(1L, 1L, 1L, 1L), .Label = "e", class = "factor"), 
    Sales = c(318L, 345L, 503L, 264L)), .Names = c("Data", "product_id", 
"shop_code", "Sales"), class = "data.frame", row.names = c(NA, 
-4L))

1 Ответ

0 голосов
/ 10 января 2019

data.table подход

Приведенный ниже код проверяет, имеет ли группа product_id и shop_code длину 48. Если это так, все строки этой группы помечаются как «завершенные», если нет, то они помечаются как «неполные».

library( data.table )
max_periods <- 48

#check if grouplenth of product_id + shop_code == 45 to set status
result <- setDT(df)[, status := ifelse( .N == max_periods, "complete", "incomplete"), by = .( product_id, shop_code) ][]
#write new tables complete/incomplete
complete <- result[ status == "complete", ][, status := NULL ]
incomplete <- result[ status == "incomplete", ][, status := NULL ]

полная

#           Data product_id shop_code Sales
#  1: 01.01.2015          x         y   318
#  2: 01.02.2015          x         y   345
#  3: 01.03.2015          x         y   503
#  4: 01.04.2015          x         y   264
#  5: 01.05.2015          x         y   266
#  6: 01.06.2015          x         y   265
#  7: 01.07.2015          x         y   231
#  8: 01.08.2015          x         y   333
#  9: 01.09.2015          x         y   376
# 10: 01.10.2015          x         y   232
# 11: 01.11.2015          x         y   197
# 12: 01.12.2015          x         y   952
# 13: 01.01.2016          x         y   375
# 14: 01.02.2016          x         y   252
# 15: 01.03.2016          x         y   267
# 16: 01.04.2016          x         y   176
# 17: 01.05.2016          x         y   181
# 18: 01.06.2016          x         y   236
# 19: 01.07.2016          x         y   208
# 20: 01.08.2016          x         y   185
# 21: 01.09.2016          x         y   196
# 22: 01.10.2016          x         y   201
# 23: 01.11.2016          x         y   207
# 24: 01.12.2016          x         y   275
# 25: 01.01.2017          x         y   116
# 26: 01.02.2017          x         y   125
# 27: 01.03.2017          x         y   242
# 28: 01.04.2017          x         y   136
# 29: 01.05.2017          x         y   193
# 30: 01.06.2017          x         y   219
# 31: 01.07.2017          x         y   183
# 32: 01.08.2017          x         y   219
# 33: 01.09.2017          x         y   194
# 34: 01.10.2017          x         y   204
# 35: 01.11.2017          x         y   191
# 36: 01.12.2017          x         y   251
# 37: 01.01.2018          x         y     4
# 38: 01.02.2018          x         y     9
# 39: 01.03.2018          x         y     9
# 40: 01.04.2018          x         y     3
# 41: 01.05.2018          x         y     7
# 42: 01.06.2018          x         y    11
# 43: 01.07.2018          x         y     8
# 44: 01.08.2018          x         y     5
# 45: 01.09.2018          x         y     5
# 46: 01.10.2018          x         y     5
# 47: 01.11.2018          x         y    11
# 48: 01.12.2018          x         y     7
#           Data product_id shop_code Sales

неполна

#          Data product_id shop_code Sales
# 1: 01.01.2015          w         e   318
# 2: 01.02.2015          w         e   345
# 3: 01.03.2015          w         e   503
# 4: 01.04.2015          w         e   264
...