R: объединение data.frames с несколькими условиями и несколькими логическими операторами - PullRequest
2 голосов
/ 22 октября 2019

Добрый день всем,

Я столкнулся со сложной проблемой, в которой хотел бы найти элегантный подход к:

  1. Объединению двух данных. кадры на:

    a. Две общие переменные;И

    б. Переменная даты, т.е. если DATE> = START_DATE & DATE <= END_DATE;И </p>

    с. Комбинированная переменная кода / идентификатора, т.е. если CODE_X == CODE_ID |CODE_X == ID

Вот data.frame 1:

CODE_ID = c("A01", "A10", "E01", "C01", "T01")
ID = c("A", "A", "E", "C", "T")
DATE = c("2008-07-01", "2008-07-01", "2009-08-01", "2008-09-01", "2009-10-01")
TF_1 = c("F", "F", "F", "F", "F")
D_VAR_1 = c("D_0101", "D_0101", "D_0101", "D_0101", "D_0102")

DF1 = data.frame(CODE_ID, ID, DATE, TF_1, D_VAR_1)

Вот data.frame 2:

CODE_X = c("A", "A10", "E", "C", "T01")
START_DATE = c("2008-07-01", "2009-07-01", "2009-07-01", "2008-07-01", "2009-07-01")
END_DATE= c("2009-06-30", "2010-06-30", "2010-06-30", "2009-06-30", "2010-06-30")
TF_2 = c("F", "F", "F", "F", "F")
D_VAR_2 = c("D_0101", "D_0102", "D_0101", "D_0101", "D_0102")
NAME = c("ACCIDENT", "MISC ACCIDENT", "ENERGY", "CONSTRUCTION", "POLITICS")

DF2 = data.frame(CODE_X, START_DATE, END_DATE, TF_2, D_VAR_2, NAME)

Мой финалdata.frame 3 выглядит так:

CODE_ID = c("A01", "A10", "E01", "C01", "T01")
ID = c("A", "A", "E", "C", "T")
DATE = c("2008-07-01", "2008-07-01", "2009-08-01", "2008-09-01", "2009-10-01")
TF_1 = c("F", "F", "F", "F", "F")
D_VAR_1 = c("D_0101", "D_0101", "D_0101", "D_0101", "D_0102")
NAME = c("ACCIDENT", "MISC ACCIDENT", "ENERGY", "CONSTRUCTION", "POLITICS")

DF3 = data.frame(CODE_ID, ID, DATE, TF_1, D_VAR_1, NAME)

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Попробуйте пакет sqldf. Это позволит вам комбинировать кадры данных, как если бы вы писали SQL-запросы. Может помочь с более сложными объединениями.

library(sqldf)


sqldf.Example <- sqldf('select DF1.*, DF2.NAME from DF1 join DF2 on (DF1.CODE_ID = DF2.CODE_X or DF1.ID = DF2.CODE_X) and DF1.DATE between DF2.START_DATE and DF2.END_DATE')
1 голос
/ 23 октября 2019

Другой вариант, использующий неэквивалентное объединение обновлений из data.table:

library(data.table) #data.table_v1.12.4
setDT(DF1)
setDT(DF2)

DF1[DF2, on=.(CODE_ID=CODE_X, DATE>=START_DATE, DATE<=END_DATE), NAME := i.NAME]
DF1[DF2, on=.(ID=CODE_X, DATE>=START_DATE, DATE<=END_DATE), 
    NAME := fifelse(is.na(x.NAME), i.NAME, x.NAME)]

, вывод:

   CODE_ID ID       DATE TF_1 D_VAR_1         NAME
1:     A01  A 2008-07-01    F  D_0101     ACCIDENT
2:     A10  A 2008-07-01    F  D_0101     ACCIDENT
3:     E01  E 2009-08-01    F  D_0101       ENERGY
4:     C01  C 2008-09-01    F  D_0101 CONSTRUCTION
5:     T01  T 2009-10-01    F  D_0102     POLITICS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...