Создание нового столбца во фрейме данных на основе дат начала и окончания - PullRequest
1 голос
/ 24 июня 2019

У меня есть следующие 2 фрейма данных:

Dataframe1 <- data.frame(Time = seq(as.POSIXct("2017-09-06 4:30:00"), as.POSIXct("2017-09-08 15:00:15"), by = "15 min"))
Dataframe2 <- data.frame(Start_Date = as.POSIXct(c("2017-09-07 4:32:00", "2017-09-07 13:02:00", "2017-09-08 10:20:00")), End_Date = as.POSIXct(c("2017-09-07 7:20:00", "2017-09-07 17:46:00", "2017-09-08 13:41:00")))

Я хочу создать в Dataframe1 (Dataframe1$New_Column) новый столбец класса "logical".Если значения в Dataframe1$Time находятся между датами начала и окончания (то есть, если они находятся между двумя датами в каждой строке Dataframe2), Dataframe1$New_Column будет TRUE, а если нет, Dataframe1$New_Column будет FALSE.Результат должен выглядеть следующим образом:

Dataframe1$New_Column <- TRUE
Dataframe1$New_Column[which(Dataframe1$Time > Dataframe2$Start_Date[1] & Dataframe1$Time< Dataframe2$End_Date[1])] <- F
Dataframe1$New_Column[which(Dataframe1$Time > Dataframe2$Start_Date[2] & Dataframe1$Time< Dataframe2$End_Date[2])] <- F
Dataframe1$New_Column[which(Dataframe1$Time > Dataframe2$Start_Date[3] & Dataframe1$Time< Dataframe2$End_Date[3])] <- F
View(Dataframe1)

Какой эффективный способ сделать это с использованием базовых функций R?

Спасибо!

1 Ответ

1 голос
/ 24 июня 2019

Неравное объединение может быть лучше

library(data.table)
Dataframe1$New_Column <- TRUE
setDT(Dataframe1)[Dataframe2, New_Column := FALSE, 
            on = .(Time > Start_Date, Time < End_Date)]
which(!Dataframe1$New_Column)
#[1]  98  99 100 101 102 103 104 105 106 107 108 132 133 134 135 136 
#[17] 137 138 139 140 141 142 143 144 145 146 147 148 149 150

С base R мы можем использовать lapply/sapply для циклического перебора строк 'Dataframe2' и сравнения

out <- !Reduce(`|`, lapply(seq_len(nrow(Dataframe2)), 
       function(i) with(Dataframe1, Time > Dataframe2$Start_Date[i] & 
           Time < Dataframe2$End_Date[i])))
which(!out)
#[1]  98  99 100 101 102 103 104 105 106 107 108 132 133 134 135 136 
#[17] 137 138 139 140 141 142 143 144 145 146 147 148 149 150


Dataframe1$New_Column <- out
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...