Слияние и усреднение данных в R по идентификатору и дате - PullRequest
0 голосов
/ 13 октября 2018

У меня есть два набора данных, которые я хотел бы объединить необычным образом.Один набор данных - это мой основной набор, который содержит идентификатор и дату и время, относящиеся к этому ID.ID может появляться несколько раз с разными датами, прикрепленными к нему:

> head(Master_Data)
# A tibble: 5 x 2
  ID    Date               
  <chr> <dttm>             
1 a     2018-03-31 00:00:00
2 a     2018-02-28 00:00:00
3 b     2018-06-07 00:00:00
4 c     2018-01-31 00:00:00
5 b     2018-02-09 00:00:00

Другой набор данных имеет тот же ID, другую дату и оценку, связанную с этим ID и датой.Идентификаторы также могут отображаться несколько раз в этом наборе данных, а также с разными датами и оценками:

> head(Score_Data)
# A tibble: 6 x 3
  ID    Date                   Score
  <chr> <dttm>                 <dbl>
1 a     2018-01-19 00:00:00     3
2 a     2018-01-01 00:00:00     5
3 a     2018-03-05 00:00:00     7
4 b     2018-01-31 00:00:00     1
5 b     2018-08-09 00:00:00     5
6 c     2018-01-17 00:00:00    10

Я хотел бы добавить дополнительный столбец к Master_Data, который дает среднее значение для оценкичто ID в Score_Data df.Сложность заключается в том, что для каждой строки в Master_Data я хочу включить в среднее значение только баллы, если переменная даты в Score_Data раньше, чем переменная даты для данной строки в Master_Data

Пример:

Для строки 1 в Master_Data я бы хотел, чтобы новый столбец возвращал значение (3 + 5 + 7) / 3 = 5. Однако для строки 2 я хотел бы видеть только(3 + 5) / 2 = 4, так как строка 3 в Score_Data имеет дату после 2/28

Мысли о том, что будет лучшим подходом для получения этого нового столбца в Master_Data?

1 Ответ

0 голосов
/ 13 октября 2018

Это решение подойдет для небольших наборов данных, но с ростом размера данных вы начнете замечать проблемы с производительностью.

library(lubridate)
library(dplyr)

master_data <- data.frame(
  ID = c('a','a','b','c','b'),
  Date = c('2018-03-31 00:00:00',
           '2018-02-28 00:00:00',
           '2018-06-07 00:00:00',
           '2018-01-31 00:00:00',
           '2018-02-09 00:00:00'))

master_data$Date <- ymd_hms(master_data$Date)

Score_Data <- data.frame(
  ID = c('a','a','a','b','b','c'),
  Date = c('2018-01-19 00:00:00',
           '2018-01-01 00:00:00',
           '2018-03-05 00:00:00',
           '2018-01-31 00:00:00',
           '2018-08-09 00:00:00',
           '2018-01-17 00:00:00'),
  Score = c(3,5,7,1,5,10))
Score_Data$Date <- ymd_hms(Score_Data$Date)

output <- apply(master_data, 1, function(x){

  value <- Score_Data %>%
    filter(ID == x[['ID']]) %>%
    filter(Date < x[['Date']]) %>%
    summarise(Val = mean(Score))

})

master_data$Output <- unlist(output)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...