我正在创建一个功能,但我需要一些最佳实践方面的帮助。
Active.Test <- function(date) {
date <- rep(date,length(df$Start.Date))
active <- rep(0,length(df$Start.Date))
active[date > df$Start.Date & date < df$End.Date] <- 1
active[df$Start.Date == df$End.Date ] <- df$Active.Time
return (active)
}
我基本上想检查一个日期(传递给函数)是否在我的数据框中的开始日期和结束日期之间。如果是,则指定1.如果开始日期和结束日期相等,则从Active.Time列中的同一行获取结果。其他所有内容的默认值均为0。
这会返回一个错误,因为它检索的第二个测试的大小不同。
我可以重写以上内容:
Active.Test <- function(date) {
date <- rep(date,length(df$Start.Date))
active <- rep(0,length(df$Start.Date))
active[date > df$Start.Date & date < df$End.Date] <- 1
active[df$Start.Date == df$End.Date] <- df$Active.Time[df$Start.Date == df$End.Date]
return (active)
}
然后,这将从Active.Time列中获取正确的元素,但这似乎不是一种优雅的方式来编写它。我也猜测它比较慢,因为我执行了两次相同的检查。
请您帮我用最佳做法重写一下这个?
编辑:这里有一些代码可以获取几行数据,然后通过检查开始日期和结束日期是否包含25/05/2016来测试使用该函数。
#Create a data frame
df <- data.frame(End.Date = as.Date(c("1/05/2016","28/05/2016", "25/05/2016"), format = "%d/%m/%Y"), Start.Date = as.Date(c("20/04/2016 11:00","20/05/2016 23:00", "25/05/2016 10:00"), format = "%d/%m/%Y" ), Active.Time = as.numeric(c(0.5,0.4,0.8)))
#Test the function
df$new <- Active.Test(as.Date("25/05/2016", format = "%d/%m/%Y"))
由于
答案 0 :(得分:0)
# Using the data.table approach
library(data.table)
# Make data table instead of data.frame (you can also do as.data.table(df) to get a data.table)
my_dt <- data.table(Start.Date=as.Date(c("20/04/2016 11:00","20/05/2016 23:00", "25/05/2016 10:00"), format = "%d/%m/%Y" ),
End.Date=as.Date(c("1/05/2016","28/05/2016", "25/05/2016"), format = "%d/%m/%Y"),
Active.Time = as.numeric(c(0.5,0.4,0.8))
)
setkey(my_dt)
# Sample date to test
datte <- as.Date("25/05/2016", format = "%d/%m/%Y")
# Create function with conditions and result to return
Active.Test <- function(datte, Start.Date, End.Date, Active.Time) {
if(datte > Start.Date & datte < End.Date){
return(1)
}
else if(Start.Date==End.Date){
return(Active.Time)
}
else{return(0)}
}
# Test function
my_dt[, res:=Active.Test(datte, Start.Date, End.Date, Active.Time), by=1:nrow(my_dt)]
有关data.table
的更多信息,请参阅data.table vignette。另外,在上面的函数中,请注意运行df$new <- Active.Test(as.Date("25/05/2016", format = "%d/%m/%Y"))
时出现的警告!