Как рассчитать количество событий в день в R, включая даты, когда события не происходили? - PullRequest
0 голосов
/ 03 мая 2020

Я хотел бы создать фрейм данных, в котором в первом столбце будут все даты за определенный период времени, а во втором - количество событий, произошедших на каждую дату, включая даты, когда события не происходили. Я также хотел бы подсчитать события, которым были назначены определенные c факторы

Первый фрейм данных, в котором у меня есть события с датами на данную дату:

Row Sex Age      Date
1    2   36   2004-01-05
2    1   47   2004-01-06
3    1   26   2004-01-10
4    2   23   2004-01-20
5    1   50   2004-01-27
6    2   35   2004-01-28
7    1   35   2004-01-30
8    1   38   2004-02-06
9    2   29   2004-02-11

Где в столбце «Пол» 1 означает женщину и 2 мужчину.

Второй кадр данных, в котором у меня есть даты за исследуемый период:

Дата строки

1  2004-01-05
 2  2004-01-06
 3  2004-01-07
 4  2004-01-08
 5  2004-01-09
 6  2004-01-10
 7  2004-01-11
 8  2004-01-12
 9  2004-01-13
10  2004-01-14

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

Row    Date       Events (All)   Events (Female)   Events (Male)
 1  2004-01-05         1                0                1
 2  2004-01-06         1                1                0
 3  2004-01-07         0                0                0
 4  2004-01-08         0                0                0
 5  2004-01-09         0                0                0
 6  2004-01-10         0                1                0
 7  2004-01-11         0                0                0
 8  2004-01-12         0                0                0
 9  2004-01-13         0                0                0
10  2004-01-14         0                0                0

Может кто-нибудь помочь?

1 Ответ

1 голос
/ 03 мая 2020

Вот один из методов:

library(data.table)
library(magrittr) # just for %>%
out <- dat1 %>%
  dcast(Date ~ Sex, data = ., fun.aggregate = length) %>%
  setnames(., c("1", "2"), c("Female", "Male")) %>%
  .[ dat2[ , .(Date)], on = "Date" ] %>%
  .[, lapply(.SD, function(a) replace(a, is.na(a), 0)), ] %>%
  .[, All := Female + Male ]
out
#           Date Female Male All
#  1: 2004-01-05      0    1   1
#  2: 2004-01-06      1    0   1
#  3: 2004-01-07      0    0   0
#  4: 2004-01-08      0    0   0
#  5: 2004-01-09      0    0   0
#  6: 2004-01-10      1    0   1
#  7: 2004-01-11      0    0   0
#  8: 2004-01-12      0    0   0
#  9: 2004-01-13      0    0   0
# 10: 2004-01-14      0    0   0

Обратите внимание, что использование lapply может быть не самым быстрым способом замены NA на 0, но оно помогает понять смысл. Кроме того, я использую magrittr::%>% просто для разбивки шагов, это можно легко сделать без %>%.

Данные:

dat1 <- fread(text = "
Row Sex Age      Date
1    2   36   2004-01-05
2    1   47   2004-01-06
3    1   26   2004-01-10
4    2   23   2004-01-20
5    1   50   2004-01-27
6    2   35   2004-01-28
7    1   35   2004-01-30
8    1   38   2004-02-06
9    2   29   2004-02-11")

dat2 <- fread(text = "
Row Date
 1  2004-01-05
 2  2004-01-06
 3  2004-01-07
 4  2004-01-08
 5  2004-01-09
 6  2004-01-10
 7  2004-01-11
 8  2004-01-12
 9  2004-01-13
10  2004-01-14")

A tidyvers ion:


dat1 <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
Row Sex Age      Date
1    2   36   2004-01-05
2    1   47   2004-01-06
3    1   26   2004-01-10
4    2   23   2004-01-20
5    1   50   2004-01-27
6    2   35   2004-01-28
7    1   35   2004-01-30
8    1   38   2004-02-06
9    2   29   2004-02-11")

dat2 <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
Row Date
 1  2004-01-05
 2  2004-01-06
 3  2004-01-07
 4  2004-01-08
 5  2004-01-09
 6  2004-01-10
 7  2004-01-11
 8  2004-01-12
 9  2004-01-13
10  2004-01-14")

library(dplyr)
library(tidyr)
as_tibble(dat1) %>%
  group_by(Date, Sex) %>%
  tally() %>%
  ungroup() %>%
  pivot_wider(id_cols = "Date", names_from = "Sex", values_from = "n",
              values_fill = list(n = 0)) %>%
  rename(Female = "1", Male = "2") %>%
  left_join(select(dat2, Date), ., by = "Date") %>%
  mutate_at(vars(Female, Male), ~ replace(., is.na(.), 0)) %>%
  mutate(All = Female + Male)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...