我编写了一个函数,该函数使用日期的开始和结束日期作为参数,基于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
答案 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_ymd
,e_ymd
和char
是标量(即不是数据框中的列),因此我们需要取消对它们的引用。请注意,mutate
函数可根据需要在矢量化函数上运行。