ddply是否对数据框中的每个变量进行了子集化?

时间:2014-12-19 15:25:05

标签: r plyr

我试图将函数应用于数据框的多个子集。在该函数中,我希望使用cut()函数按月再次进行子集,并使用daply()应用另一个函数。由于某种原因,在传递给第一个函数的数据帧中,即使str()报告数据帧的观察数量少于原始完整数据帧,我尝试子集化的变量是更大的。

一些代码可以帮我解释一下:

此代码调用读取数据,然后在第10行调用ddply()。假设数据在此处有85110个观察值。

fracStatsByMonthHour <- function(file,interval){
    library(plyr)
    print("reading")
    data <- readData(file)
    print("finding highs")
    data$hifrac <- isHighFractal(data$high,interval)
    print("finding lows")
    data$lofrac <- isLowFractal(data$low,interval)
    print("calculating stats")
    result <- ddply(data,c("month","hour"),fracStats)
    print("converting to numeric")
    result[,c(-1,-2)] <- sapply(result[,c(-1,-2)],as.numeric)
    result
}

下一个函数fracStats()cut()函数失败,因为它表示data$datetime的长度为85110,但数据只有7172个观察值(因为它按月和小时分割通过ddply在上面的函数中)

fracStats <- function(data){

    data$month <- cut(data$datetime, breaks = "month")            
    ranges <- daply(data, "month" , fracRange)
    mean <- mean(ranges)
    median <- median(ranges)
    mode <- names(sort(-table(ranges)))[1]
    sd <- sd(ranges)
    quants <- quantile(ranges, seq(0,1,0.1), type = 1)
    res <- c(mean,median,mode,sd,quants)
    names(res) <- c("mean","median","mode","sd",names(quants))
    res
}

这里发生了什么?为什么日期时间栏没有像其他栏一样分开?

来自str(data)内部的fracStatsByMonthHour()来自实际的代码运行:

'data.frame':   85110 obs. of  12 variables:
 $ symbol  : Factor w/ 1 level "EURUSD": 1 1 1 1 1 1 1 1 1 1 ...
 $ datetime: POSIXlt, format: "2001-01-02 23:01:00" "2001-01-03 00:00:00" "2001-01-03 01:00:00" "2001-01-03 02:00:00" ...
 $ open    : num  0.951 0.951 0.95 0.95 0.95 ...
 $ high    : num  0.951 0.951 0.951 0.951 0.951 ...
 $ low     : num  0.951 0.949 0.95 0.95 0.95 ...
 $ close   : num  0.951 0.95 0.951 0.95 0.95 ...
 $ volume  : int  176 232 224 240 212 228 232 236 240 240 ...
 $ hour    : Factor w/ 24 levels "00","01","02",..: 24 1 2 3 4 5 6 7 8 9 ...
 $ month   : Factor w/ 12 levels "01","02","03",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ year    : Factor w/ 14 levels "2001","2002",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ hifrac  : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ lofrac  : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...```

并且来自fracStats()

'data.frame':   7172 obs. of  12 variables:
 $ symbol  : Factor w/ 1 level "EURUSD": 1 1 1 1 1 1 1 1 1 1 ...
 $ datetime: POSIXlt, format: "2001-01-02 23:01:00" "2001-01-03 00:00:00" "2001-01-03 01:00:00" "2001-01-03 02:00:00" ...
 $ open    : num  0.951 0.951 0.95 0.95 0.95 ...
 $ high    : num  0.951 0.951 0.951 0.951 0.951 ...
 $ low     : num  0.951 0.949 0.95 0.95 0.95 ...
 $ close   : num  0.951 0.95 0.951 0.95 0.95 ...
 $ volume  : int  176 232 224 240 212 228 232 236 240 240 ...
 $ hour    : Factor w/ 24 levels "00","01","02",..: 24 1 2 3 4 5 6 7 8 9 ...
 $ month   : Factor w/ 12 levels "01","02","03",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ year    : Factor w/ 14 levels "2001","2002",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ hifrac  : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ lofrac  : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 - attr(*, "vars")= chr "month"```

,最后str(data$datetime)来自fracStats()

POSIXlt[1:85110], format: "2001-01-02 23:01:00" "2001-01-03 00:00:00" "2001-01-03 01:00:00" "2001-01-03 02:00:00" "2001-01-03 03:00:00" ...

为什么1:85110代替1:7172

0 个答案:

没有答案