这个非常简单的函数的目的只是将日期列转换为日期变量,将数字时间(每小时)列转换为因子变量,稍后将在代码中与plyr一起使用。 我可以让这段代码在命令行中成功运行,但是当我尝试在函数中运行它时,我得到一个错误。
# setting up some fake data
set.seed(31)
foo <- function(myHour, myDate){
rlnorm(1, meanlog=0,sdlog=1)*(myHour) + (150*myDate)
}
Hour <- 1:24
Day <-1:1080
dates <-seq(as.Date("2010-01-01"), by = "day", length.out= 1080)
myData <- expand.grid( Day, Hour)
names(myData) <- c("Date","Hour")
myData$Adspend <- apply(myData, 1, function(x) foo(x[2], x[1]))
myData$Date <-dates
myData$Demand <-(rnorm(1,mean = 0, sd=1)+.75*myData$Adspend)
#############################################################
myData
# Function Creation
AddCal <-function(DF,Date,Time) {
DF$Date<-as.Date(DF$Date, format="%m/%d/%Y")#Change Date variable into a date type
DF$Time<-factor(DF$Time,levels=`c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24))
}
#Test Function
Bob<-AddCal(myData,Date,Hour)
#Error I receive
Error in `$<-.data.frame`(`*tmp*`, "Time", value = integer(0)) :
replacement has 0 rows, data has 25920
我花了大约2个小时寻找答案并尝试不同的事情。因为我可以在命令行运行各行代码并获得所需的结果,所以我认为这是一个超出我新手功能的高级编码问题。
答案 0 :(得分:4)
在您的函数中,将DF$Time
的所有DF[[Time]]
替换为DF$Date
。{
另请参阅@Dwin&amp; amp;中的以下两条评论。 @mrip:
当您使用DF$Time
时,R
正在Time
中寻找名为DF
的列。 不将Time
视为您期望的字符串变量。
DF[[Time]]
会将Time
视为变量。
错误仅指Time
而不是Date
的原因是因为Date既是变量的名称,也是DF
中列的名称。 (如果在你的函数调用中你会使用类似AddCal(.. Date=Demand)
或其他任何列名的东西,你就不会得到你期望的结果)
c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
相当于
seq(24)
和1:24