0

这个非常简单的函数的目的只是将日期列转换为日期变量,将数字时间(每小时)列转换为因子变量,稍后将在代码中与 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 个小时寻找答案并尝试不同的事情。因为我可以在命令行运行单独的代码行并获得所需的结果,所以我假设这是一个超出我的新手能力的高级编码问题。

4

1 回答 1

4

在您的函数中,将所有实例替换DF$TimeDF[[Time]] 相同的 for DF$Date
另请参阅@Dwin 和@mrip 下面的两条评论:

  • 确保返回一个值
  • 确保在需要字符串的地方传递字符串参数

这是怎么回事:

使用时DF$TimeR正在寻找名为Timein的列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

于 2013-10-11T00:14:01.743 回答