执行测试,从同一行的另一列获取结果

时间:2016-02-11 23:31:17

标签: r

我正在创建一个功能,但我需要一些最佳实践方面的帮助。

    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")) 

由于

1 个答案:

答案 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"))时出现的警告!