根据R

时间:2018-12-09 05:18:52

标签: r datetime

我编写了一个函数,该函数使用日期的开始和结束日期作为参数,基于datetime列创建列,但是我无法使其正常工作。

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 :(得分:1)

根据您的描述,我的理解是,您要检查行中的日期是否在开始日期和结束日期(标量)之间,并相应地更新group_var的值。

lubridate软件包提供了一组工具,可轻松使用日期。为了比较日期,您不需要格式化日期。 format仅有助于查看这些日期。我使用了dplyr软件包,该软件包可让您轻松执行数据转换。

为解决此问题,我们使用dplyr::mutate函数,该函数可以按行转换其他列的功能。在这种情况下,我们将数据集中(start_time)中的date列与标量开始和结束时间进行比较,以编入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_ymde_ymdchar是标量(即不是数据框中的列),因此我们需要取消对它们的引用。请注意,mutate函数可根据需要在矢量化函数上运行。