R: для новой переменной в строке [i] сравните всю строку в столбцах x и y - PullRequest
0 голосов
/ 14 февраля 2019

Я ищу код, подобный циклу for, который просматривает все строки определенных столбцов, чтобы создать новую переменную для строки [i].

У меня есть фрейм данных, который включает в основном три столбца,Начало интервала, конец интервала и дата измерения.Во всех трех столбцах значения имеют формат YearMonthDayHourMinute.Дата измерения непрерывна все 10 минут.Интервал - это просто короткие периоды, которые оставляют множество NA, где дата измерения не соблюдается.

Фрейм данных выглядит следующим образом:

interval_start interval_end measuring_date
1             NA           NA   201805021210
2   201805021220 201805021250   201805021220
3             NA           NA   201805021230
4             NA           NA   201805021240
5             NA           NA   201805021250
6             NA           NA   201805021300

Теперь я хочу R ксоздайте новый столбец, который дает «Да», где период измерения находится в пределах интервала, и «Нет», где это не так.

Примерно так:

interval_start interval_end measuring_date within_interval
1             NA           NA   201805021210              No
2   201805021220 201805021250   201805021220             Yes
3             NA           NA   201805021230             Yes
4             NA           NA   201805021240             Yes
5             NA           NA   201805021250             Yes
6             NA           NA   201805021300              No

Итак, я хочу, чтобы R взяла измерение_даты строки 1 и сравнило его с interval_start и interval_end строки 1,2,3,4,5 и 6То же самое для измерения_даты строки 2 и так далее.Проблема, с которой я столкнулся сейчас, заключается в том, что я пытался использовать циклы for с if else и вложенными циклами for (см. Ниже), но R, похоже, не в состоянии взять measure_date строки 1 и сравнить его со всеми строками в interval_start и interval_end,Сравнивается только в пределах одного ряда.Итак, все, что я могу получить, это:

interval_start interval_end measuring_date within_interval
1             NA           NA   201805021210              No
2   201805021220 201805021250   201805021220             Yes
3             NA           NA   201805021230              No
4             NA           NA   201805021240              No
5             NA           NA   201805021250              No
6             NA           NA   201805021300              No

Кто-нибудь знает решение этой проблемы?Возможно, есть решения за пределами цикла, с которыми я не сталкивался.Я искал весь интернет, но не нашел никакого решения, которое оставило бы меня довольно расстроенным.Даже мой руководитель беспомощен. Надеюсь, мой вопрос достаточно ясен, извините, я впервые использую stackoverflow ..

for (i in 1:nrow(masterX)){ 

  masterX$Within_Searching_Period[i] <- NA 

  for (j in 1:nrow(masterX)){

    if (masterX$MESS_DATUM[i] >= masterX$time_date_start_min[j] & 
        masterX$MESS_DATUM[i] <= masterX$time_date_end_min[j]) {

      masterX$Within_Searching_Period[i] <- "YES"

    } else {masterX$Within_Searching_Period[i] <- "NO"

    }

  }
}

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Используя пакет data.table, вы можете использовать неравномерное объединение, чтобы определить, находится ли дата измерения в каком-либо интервале:

DT[, within_interval := 
    DT[DT, .N > 0 ,on=.(interval_start <= measuring_date, interval_end >= measuring_date), by=.EACHI]$V1
]

вывод:

        interval_start        interval_end      measuring_date within_interval
1:                <NA>                <NA> 2018-05-02 12:10:00           FALSE
2: 2018-05-02 12:20:00 2018-05-02 12:50:00 2018-05-02 12:20:00            TRUE
3:                <NA>                <NA> 2018-05-02 12:30:00            TRUE
4:                <NA>                <NA> 2018-05-02 12:40:00            TRUE
5:                <NA>                <NA> 2018-05-02 12:50:00            TRUE
6:                <NA>                <NA> 2018-05-02 13:00:00           FALSE

данные:

library(data.table)
DT <- fread("interval_start,interval_end,measuring_date
NA,NA,201805021210
201805021220,201805021250,201805021220
NA,NA,201805021230
NA,NA,201805021240
NA,NA,201805021250
NA,NA,201805021300", colClasses="character")
DT[, (names(DT)) := lapply(.SD, as.POSIXct, format="%Y%m%d%H%M")]
0 голосов
/ 14 февраля 2019

Вместо того, чтобы фокусироваться на цикле, лучше попытаться написать векторизованный код.Я использовал синтаксис lubridate и tidyverse.Если вы много работаете с датами, стоит посмотреть документацию lubridate.

library(tidyverse)
library(lubridate)
data %>%
mutate_at(vars(time_date_start_min, time_date_end_min, MESS_DATUM), ymd_hm) %>%
mutate(within_interval = 
           ifelse(MESS_DATUM %within% interval(time_date_start_min, time_date_end_min) %in% TRUE, "Yes", "No"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...