Вставка строк для отсутствующих данных в R - с 0 количеством - PullRequest
1 голос
/ 21 июня 2020

ОРИГИНАЛЬНЫЕ ДАННЫЕ

Person   month   Year Quantity
A         02  2018   900
A         04  2018   600
A         09  2018   300
A         04  2019   40
B         06  2018   56
B         01  2019   10
B         09  2019   20

ТРЕБУЕМЫЙ ВЫВОД

Person   month   Year Quantity
A         01  2018   0
A         02  2018   900
A         03  2018   0
A         04  2018   600
A         05  2018   0
A         06  2018   0
A         07  2018   0
A         08  2018   0
A         09  2018   300
A         10  2018   0
A         11  2018   0
A         12  2018   0
A         01  2019   0
A         01  2019   0
A         02  2019   0
A         03  2019   0
A         04  2019   40
A         05  2019   0
A         06  2019   0
A         07  2019   0
A         08  2019   0
A         09  2019   0
A         10  2019   0
A         11  2019   0
A         12  2019   0
B         01  2018   0
B         02  2018   0
B         03  2018   0
B         04  2018   0
B         05  2018   0
B         06  2018   56
B         07  2018   0
B         08  2018   0
B         09  2018   0
B         10  2018   0
B         11  2018   0
B         12  2018   0
B         01  2019   10
B         02  2019   0
B         03  2019   0
B         04  2019   0
B         05  2019   0
B         06  2019   0
B         07  2019   0
B         08  2019   0
B         09  2019   20
B         10  2019   0
B         11  2019   0
B         12  2019   0

Привет всем,

У меня есть пример данных выше в кадре данных R, и я хотел бы добавьте 0 «количества» для каждого месяца, в котором отсутствуют данные для «человека». У меня пропущены месяцы и год, как вы можете видеть, которые я хотел бы вставить в свой фрейм данных для каждого человека. т.е. сложить значения месяцев-года 0 спроса от человека для недостающих месяцев. (Просто чтобы дать некоторую предысторию, исходные данные, которые у меня были, имели дату для каждого запроса, но я сгруппировал это по месяцам и годам, поскольку я извлек значения месяца и года из поля даты, как показано ниже ....

PersonMonthDemand <-
  DateData %>%
  mutate(month = month(DateOfDemand))%>%
  mutate(year= year(DateOfDemand))%>%
  group_by(Person, month, year) %>%
  summarise(Quantity = sum(Quantity)) 

, что привело к ОРИГИНАЛЬНЫМ данным, как показано выше)

Буду признателен, если некоторые эксперты могут помочь. Заранее спасибо. С уважением, Гаятри

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Создайте левую базовую таблицу.

Для этого возьмите уникальные значения всех клиентов:

cstmr<-data.frame(unique(orgn_data$Person))
change column names
names(cstmr)[1]<-'Person'

Найдите все комбинации даты и года во фрейме данных, используя :

orgn_data_year_mnth<-unique(orgn_data[c("month", "Year")])
cross join cstmr & organ_data_year_mnth using
cc<-merge(cstmr, organ_data_year_mnth)

Последний шаг будет оставлен присоединиться к исходным данным на cc:

final_df<-merge(cc,orgn_data,by=c('Person','month','Year'),all.x=TRUE)

А затем заменить все NA на 0, используя:

final_df[is.na(final_df)] <- 0
1 голос
/ 21 июня 2020

Мы можем использовать complete из tidyr

library(tidyr)
library(dplyr)
df1 %>%
    complete(Person, month = 1:12, Year, fill = list(Quantity = 0)) %>% 
    arrange(Person, Year)
# A tibble: 48 x 4
#  Person month  Year Quantity
#   <chr>  <int> <int>    <dbl>
# 1 A          1  2018        0
# 2 A          2  2018      900
# 3 A          3  2018        0
# 4 A          4  2018      600
# 5 A          5  2018        0
# 6 A          6  2018        0
# 7 A          7  2018        0
# 8 A          8  2018        0
# 9 A          9  2018      300
#10 A         10  2018        0
# … with 38 more rows

### data

df1 <- structure(list(Person = c("A", "A", "A", "A", "B", "B", "B"), 
    month = c(2L, 4L, 9L, 4L, 6L, 1L, 9L), Year = c(2018L, 2018L, 
    2018L, 2019L, 2018L, 2019L, 2019L), Quantity = c(900L, 600L, 
    300L, 40L, 56L, 10L, 20L)), class = "data.frame", row.names = c(NA, 
-7L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...