Завершение или вставка пустых строк между упорядоченными факторами - PullRequest
1 голос
/ 19 февраля 2020

У меня есть фрейм данных, в котором я агрегировал общую активность на члена за 15 разных месяцев (как упорядоченные факторы). Теперь месяцы / уровни, в которых у участника не было никакой активности, просто пропускаются, поскольку в исходных данных нет строк.

Данные выглядят так:

MemberID  MonthYr  freq 
1         04-2014    2
1         05-2014    3
1         07-2014    2
1         08-2014    5
2         04-2014    3
2         05-2014    3
3         06-2014    6
3         07-2014    4
3         11-2014    2
3         12-2014    3

Я хочу вставлять новые строки между активными месяцами, чтобы месяцы показывали частоту 0.

Примерно так:

MemberID  MonthYr  freq 
1         04-2014    2
1         05-2014    3
1         06-2014    0
1         07-2014    2
1         08-2014    5
2         04-2014    3
2         05-2014    3
3         06-2014    6
3         07-2014    4
3         08-2014    0
3         09-2014    0
3         10-2014    0
3         11-2014    2
3         12-2014    3

Однако каждый участник не стал участником одновременно , поэтому 0 могут быть между минимальным и максимальным MonthYr для каждого члена.

1 Ответ

3 голосов
/ 19 февраля 2020

Мы можем использовать complete, чтобы сделать это. Преобразуйте 'MonthYr' в класс Date, затем сгруппируйте его по 'MemberID', используйте complete, чтобы увеличить 'MonthYr' с min до max 'Date' by 'month', а fill с помощью 'freq' с 0 и, если необходимо, конвертируем обратно 'MonthYr' в оригинал format

library(dplyr)
library(tidyr)
library(zoo)
df1 %>% 
   mutate(MonthYr = as.Date(as.yearmon(MonthYr, "%m-%Y"))) %>% 
   group_by(MemberID) %>% 
   complete(MonthYr = seq(min(MonthYr), max(MonthYr), by = '1 month'), 
      fill = list(freq = 0)) %>% 
   mutate(MonthYr = format(MonthYr, "%m-%Y"))
# A tibble: 14 x 3
# Groups:   MemberID [3]
#   MemberID MonthYr  freq
#      <int> <chr>   <dbl>
# 1        1 04-2014     2
# 2        1 05-2014     3
# 3        1 06-2014     0
# 4        1 07-2014     2
# 5        1 08-2014     5
# 6        2 04-2014     3
# 7        2 05-2014     3
# 8        3 06-2014     6
# 9        3 07-2014     4
#10        3 08-2014     0
#11        3 09-2014     0
#12        3 10-2014     0
#13        3 11-2014     2
#14        3 12-2014     3

data

df1 <- structure(list(MemberID = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 
3L), MonthYr = c("04-2014", "05-2014", "07-2014", "08-2014", 
"04-2014", "05-2014", "06-2014", "07-2014", "11-2014", "12-2014"
), freq = c(2L, 3L, 2L, 5L, 3L, 3L, 6L, 4L, 2L, 3L)),
class = "data.frame", row.names = c(NA, 
-10L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...