-4

请在
https://www.box.com/s/z3tldpdykhppmivfexjl中下载文件

,将其另存为'/tmp/mydata'
并运行以下代码

datafile="/tmp/mydata"
totalsize=file.info(datafile)$size
lines=totalsize/32
con=file(datafile,"rb")
date<-c()
data<-c()
for (i in 1:lines){
    result1<-readBin(con,integer(),n=1,size=4,endian="little")
    date<-c(date,result1)
    result2<-round(readBin(con,double(),n=7,size=4,endian="little"),2)
    data<-c(data,result2)
}
date=data.frame(matrix(date,nrow=lines,ncol=1,byrow=TRUE))
data=data.frame(matrix(round(data,2),nrow=lines,ncol=7,byrow=TRUE))
data=cbind(date,data)
names(data)<-c("date","open","high","low","close","volume","amount","reserved")
data<-data[-c(1:2),]

完成后,请data在 R 控制台中输入,
可以看到长数字, https://www.box.com/s/lxkbs96vk02p6ekdflbe
在此处输入图像描述 为什么round(data,2)不能四舍五入?
太奇怪了,当我将数据写入 csv 文件时,打开 csv 文件,我发现它只有 2 位数字!

write.csv(file="/tmp/test",data)

Joris Meys 说在 for 循环中增长向量是不好的方法,但我发现在我的情况下这可能是一个好方法,如果不是,如何修改它?让我看看更好的代码。

4

1 回答 1

1

关于增加循环的问题,如果您不知道读取的每个二进制向量的长度,一种选择是将所有内容放入列表中(因为我不知道,因为我没有下载您的数据也没有运行您的代码!) . 进入列表后,如果读入的每个元素的长度相同,或者在这种情况下,如果您想要的只是一个向量,则只需unlist()每个列表即可。

datafile <- "/tmp/mydata"
totalsize <- file.info(datafile)$size
lines <- totalsize / 32
con <- file(datafile, "rb")
## allocate storage
date <- data <- vector(mode = "list", length = lines)
## although actually growing lists is not inefficient
for (i in 1:lines){
    ## directly fill in the lists we created using index i to point
    ## to the ith component of each list
    date[[i]] <- readBin(con, integer(), n=1, size=4, endian="little")
    data[[i]] <- round(readBin(con,double(), n=7, size=4, endian="little"), 2)
}

此时您有两个列表,如果您希望将它们压缩成一个向量,请执行

date <- unlist(date)
data <- unlist(date)
于 2012-10-20T16:32:14.243 回答