我试图将函数应用于数据框的多个子集。在该函数中,我希望使用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
?