Как сравнить даты и изменить значения в другом столбце по группам в R - PullRequest
2 голосов
/ 14 апреля 2019

У меня есть два фрейма данных,

ID           DATE         EVENT
300-1-003    2019-07-14   4
300-1-004    2019-10-27   4
300-1-004    2019-10-29   4
300-1-008    2019-10-11   4


ID           DATE         EVENT
300-1-001    2019-10-22   0
300-1-002    2019-10-02   0
300-1-004    2019-10-27   0
300-1-004    2019-10-30   0
300-1-008    2019-10-11   0

Я хочу изменить значение в столбце СОБЫТИЕ в первом фрейме данных на 1, если ДАТА одинакова для одного и того же идентификатора в обоих фреймах данных.

Я пытался сделать это с

df1$EVENT= ifelse(df1$DATE=df2$DATE & df1$ID=df2$ID, 1, 4)

Также попытался использовать фильтр, чтобы сначала указать ту же дату.

df2_2= filter(df1$DATE=df2$DATE)

Но я получил ошибку, как показано ниже для второго метода, и первый метод просто не работает ...

Error: unexpected '=' in "df2_2= filter(df1$DATE="

И класс (df1 $ DATE), и класс (df2 $ DATE) имеют значение "Дата". Мой желаемый результат будет как

ID           DATE         EVENT
300-1-003    2019-07-14   4
300-1-004    2019-10-27   1
300-1-004    2019-10-29   4
300-1-008    2019-10-11   4

Я искал, как сравнивать даты .. Полагаю, я мог бы сравнить это так? Я застрял на несколько часов, наверное, я просто не понял бы, как это сделать .. Я был бы признателен за любую помощь ....

1 Ответ

1 голос
/ 14 апреля 2019

Мы можем объединить on столбцы 'DATE' и 'ID' и присвоить (:=) 'EVENT' в 'df1' 1

library(data.table)
setDT(df1)[df2,  EVENT := 1, on = .(DATE, ID)]

Кроме того, ifelse можно изменить на

with(df1, ifelse(DATE %in% df2$DATE & ID %in% df2$ID, 1, EVENT))

Данные

df1 <- structure(list(ID = c("300-1-003", "300-1-004", "300-1-004", 
"300-1-008"), DATE = c("2019-07-14", "2019-10-27", "2019-10-29", 
"2019-10-11"), EVENT = c(4L, 4L, 4L, 4L)), class = "data.frame", 
row.names = c(NA, -4L))

df2 <- structure(list(ID = c("300-1-001", "300-1-002", "300-1-004", 
"300-1-004", "300-1-008"), DATE = c("2019-10-22", "2019-10-02", 
"2019-10-27", "2019-10-30", "2019-10-11"), EVENT = c(0L, 0L, 
0L, 0L, 0L)), class = "data.frame", row.names = c(NA, -5L))
...