L oop через все записи в одном кадре данных, чтобы найти совпадения на основе критериев даты в другом кадре данных в R - PullRequest
0 голосов
/ 16 июня 2020

Итак, у меня есть следующий фрейм данных, называемый df1 :

df1 <- structure(list(startTime = structure(c(1519903920, 1519905060, 
1519913740, 1519919880), class = c("POSIXct", "POSIXt"), tzone = "America/New_York"), 
    endTime = structure(c(1519904880, 1519912200, 1519913940, 
    1522142880), class = c("POSIXct", "POSIXt"), tzone = "America/New_York"), 
    impact = c(92.17, 616.43, 63.69, 14.69), impactPercent = c(184.15, 
    1495.17, 138.69, 19.97), impactSpeedDiff = c(3587.72, 25726.22, 
    2616.01, 474.11), maxQueueLength = c(5.76053, 5.76053, 4.829511, 
    2.447619), tmcs = list(c("110N04623", "110-04623", "110N04624", 
    "110-04624", "110N04625", "110-04625", "110N04626", "110-04626", 
    "110N04627"), c("110N04623", "110-04623", "110N04624", "110-04624", 
    "110N04625", "110-04625", "110N04626", "110-04626", "110N04627"
    ), c("110N04623", "110-04623", "110N04624", "110-04624", 
    "110N04625", "110-04625", "110N04626", "110-04626"), c("110N04623", 
    "110-04623", "110N04624", "110-04624", "110N04625")), early_startTime = structure(c(1519903620, 
    1519904760, 1519913740, 1522133400), class = c("POSIXct", 
    "POSIXt"), tzone = "America/New_York")), row.names = c(NA, 
4L), class = "data.frame")

И, учитывая этот фрейм данных, мне нужно сопоставить следующий фрейм данных ( df2 ).

df2 <- structure(list(created_tstamp = structure(c(1519926899, 1519913840, 
1519913840, 1519927924, 1522141200, 1522152619, 1522152708, 1522152728, 
1519928416, 1519928785, 1519929080, 1519929306, 1519929964, 1519930050, 
1522154148, 1519930311, 1519930139, 1519930470, 1519930660, 1519929579
), class = c("POSIXct", "POSIXt"), tzone = "America/New_York"), 
    closed_tstamp = structure(c(1519929764, 1519926987, 1519927686, 
    1519928360, 1522152738, 1522152779, 1522154882, 1522152819, 
    1519928464, 1519928914, 1519929266, 1519929741, 1519939420, 
    1519930622, 1522155300, 1519930334, 1519931054, 1519951230, 
    1519930766, 1519930830), class = c("POSIXct", "POSIXt"), tzone = "America/New_York"), 
    code = c("110-04508", "110N04623", "110N04623", "110P05583", 
    "", "", "110N04485", "110N04357", "110-05066", "110-04421", 
    "110N04421", "110P04577", "110-04204", "110-04269", "110+04673", 
    "110-04445", "", "110P05797", "110N04269", "110+04520")), row.names = c(NA, 
20L), class = "data.frame")

Соответствие определяется двумя критериями вместе:

  1. created_tstamp дюйм df2 находится между early_startTime и endTime дюйм df1
  2. code в df2 существует в той же ячейке tmcs в df1

Оба условия должны быть выполнены, чтобы его можно было рассматривать матч. В конечном итоге я хотел бы создать идентификатор, чтобы каждая строка df2 соответствовала соответствующему совпадению в df1 . это, вероятно, сделано с помощью каких-то al oop, но я не уверен, как это написать. Примечание: это подмножество данных.

Если точка данных в df2 не имеет соответствия в df1 , в столбце идентификатора должно быть указано NA . и оба df должны в конце получить столбец идентификатора.

1 Ответ

1 голос
/ 16 июня 2020

Я считаю, что это должно сработать. Трудно сказать, поскольку он не возвращает совпадений с предоставленными данными. Это потому, что ни один из created_tstamp не раньше, чем ваш endTime

Изменить: теперь, когда у нас есть совпадение с обновленным вопросом, мы можем манипулировать выводом следующим образом:

test <- apply(df2,1, function(x) which(
    x[1] > df1$early_startTime & 
    x[1] < df1$endTime &
    grepl(x[3], df1$tmcs) &
    x[3] != ""
    ))


IDlist <- lapply(test,paste0,collapse=";")
df2$ID <- unlist(ifelse(lengths(test) > 0,IDlist, NA))

вывод:

> df2
        created_tstamp       closed_tstamp      code   ID
1  2018-03-01 12:54:59 2018-03-01 13:42:44 110-04508 <NA>
2  2018-03-01 09:17:20 2018-03-01 12:56:27 110N04623    2
3  2018-03-01 09:17:20 2018-03-01 13:08:06 110N04623    2
4  2018-03-01 13:12:04 2018-03-01 13:19:20 110P05583 <NA>
5  2018-03-27 05:00:00 2018-03-27 08:12:18           <NA>
6  2018-03-27 08:10:19 2018-03-27 08:12:59           <NA>
7  2018-03-27 08:11:48 2018-03-27 08:48:02 110N04485 <NA>
8  2018-03-27 08:12:08 2018-03-27 08:13:39 110N04357 <NA>
9  2018-03-01 13:20:16 2018-03-01 13:21:04 110-05066 <NA>
10 2018-03-01 13:26:25 2018-03-01 13:28:34 110-04421 <NA>
11 2018-03-01 13:31:20 2018-03-01 13:34:26 110N04421 <NA>
12 2018-03-01 13:35:06 2018-03-01 13:42:21 110P04577 <NA>
13 2018-03-01 13:46:04 2018-03-01 16:23:40 110-04204 <NA>
14 2018-03-01 13:47:30 2018-03-01 13:57:02 110-04269 <NA>
15 2018-03-27 08:35:48 2018-03-27 08:55:00 110+04673 <NA>
16 2018-03-01 13:51:51 2018-03-01 13:52:14 110-04445 <NA>
17 2018-03-01 13:48:59 2018-03-01 14:04:14           <NA>
18 2018-03-01 13:54:30 2018-03-01 19:40:30 110P05797 <NA>
19 2018-03-01 13:57:40 2018-03-01 13:59:26 110N04269 <NA>
20 2018-03-01 13:39:39 2018-03-01 14:00:30 110+04520 <NA>
...