Создать столбец на основе значений столбца даты в R - PullRequest
0 голосов
/ 09 декабря 2018

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

df - это объект фрейма данных.

create_gv <- function(df, s_ymd, e_ymd, char) {
    df<-get(df)
    for (i in (1:nrow(df))) {
        ymd <- format(df[i,1],"%y%m%d")
        if ((strptime(ymd,format = "%y%m%d") >= strptime(s_ymd,format = "%y%m%d") & strptime(ymd,format = "%y%m%d") <= strptime(e_ymd,format = "%y%m%d")) == TRUE) {
            df$group_var[i]<-char
    }
  }
}


create_gv("example","171224","171224","D")

Я получаю

> example
           start_time group_var
1 2017-12-24 10:42:39        NA
2 2017-12-24 10:44:31        NA
3 2018-01-14 12:05:53        NA
4 2018-01-14 12:22:12        NA

Воспроизводимый фрейм данных с именем example здесь:

example <- structure(list(start_time = structure(c(1514112159, 1514112271, 1515931553, 1515932532), class = c("POSIXct", "POSIXt"), tzone = ""),  group_var = c(NA, NA, NA, NA)), .Names = c("start_time", "group_var"), row.names = c(NA, -4L), class = "data.frame")

Желаемый вывод:

           start_time group_var
1 2017-12-24 10:42:39         D
2 2017-12-24 10:44:31         D
3 2018-01-14 12:05:53         NA
4 2018-01-14 12:22:12         NA

1 Ответ

0 голосов
/ 09 декабря 2018

Из вашего описания я понимаю, что вы хотите проверить, находится ли дата в строке между начальной и конечной датами (которые являются скалярами), и соответственно обновить значение group_var.

Пакет lubridate предоставляет набор инструментов, которые позволяют легко работать с датами.Для сравнения дат вам не нужно их форматировать.format помогает только при просмотре этих дат.Я использовал пакет dplyr, который позволяет легко выполнять преобразования данных.

Для решения проблемы мы используем функцию dplyr::mutate, которая преобразует столбец за строкой, как функцию других столбцов.В этом случае столбец даты в нашем наборе данных (start_time) сравнивается со скалярным временем начала и окончания, чтобы кодифицировать переменную group_var.

library(lubridate)
library(magrittr)

char <- "D"
# Randomly setting the start and end times for the purpose of the example. Any value can be passed to this.
s_ymd <- df$start_time[1] - 5000
e_ymd <- df$start_time[2] + 5000

df %>% dplyr::mutate(group_var = ifelse(start_time > s_ymd & start_time < 
                                         e_ymd,
                                         char, NA)) -> df
df

Чтобы использовать функцию напрямую, напишите:

create_gv <- function(start_time, s_ymd, e_ymd, char){
    g_var <- ifelse(start_time > s_ymd & start_time < e_ymd,
                                    char, NA)
    return(g_var)
}

df %>% dplyr::mutate(group_var = create_gv(start_time, !!s_ymd, !!e_ymd, 
                                                                !!char)) 

Здесь, поскольку s_ymd, e_ymd и char являются скалярами (т. Е. Не столбцами во фрейме данных), нам необходимо их заключить в кавычки.Обратите внимание, что функция mutate работает с векторизованными функциями по желанию.

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