简单用户中的错误定义与R中的数据转换相关的功能

时间:2013-10-11 00:06:20

标签: r function

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

1 个答案:

答案 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