我在数据帧(“datafile”)中有一些原始数据,我已经处理并将其输出存储在新的数据帧(“结果”)中。输出数据框有三列 - trade,trade.date和trade.price。出于某种原因,“trade.date”显示R的内部日期编号,而不是标准格式的日期(“yyyy-mm-dd”)。我所读到的类似问题的解决方案似乎都没有效果。我错过了什么?
# READ RAW DATA
datafile<-data.frame(date=index(final2), coredata(final2),stringsAsFactors=FALSE)
datafile<-datafile[1:5,]
# SHOW DATA
datafile
#date close Worst Stress Support FairValue Resistance BestCase Bubble
#1 2001-01-02 1015.79 740.293 1024.67 1658.02 2366.08 2571.79 2814.98 3664.04
#2 2001-01-03 1043.74 741.349 1024.84 1658.16 2366.32 2571.83 2814.93 3663.55
#3 2001-01-04 1034.66 741.772 1024.64 1657.72 2366.02 2571.69 2814.82 3663.39
#4 2001-01-05 1046.99 741.849 1024.57 1657.84 2365.97 2571.69 2814.76 3663.94
#5 2001-01-08 1033.98 741.686 1024.55 1657.98 2365.92 2571.82 2814.93 3663.38
# CREATE A DATAFRAME FOR HOLDING PROCESSED DATA
result<-data.frame(trade=NA, trade.date=NA, trade.price=NA)
# PROCESS DATA
i<-1
rows<-nrow(datafile)
while (i < rows) {
if (datafile[i,"close"] < datafile[i,"Resistance"]) {
trade <- "long"
trade.date <- datafile[i,"date"]
trade.price <- datafile[i,"close"]
result[i,]<-c(trade,as.Date(trade.date),trade.price)
i=i+1
}
}
result
trade trade.date trade.price
1 long 11324 1015.79
2 long 11325 1043.74
3 long 11326 1034.66
4 long 11327 1046.99
答案 0 :(得分:4)
在您的代码中,c(trade, as.Date(trade.date), trade.price)
会创建一个包含三个值的向量。向量的所有元素必须属于同一个类,因此R
将trade.date
强制转换为数字。您可以使用cbind
(“列绑定”)代替c
来避免这种情况。我也简化了一些代码。
# PROCESS DATA
for (i in 1:nrow(datafile)) {
if (datafile[i,"close"] < datafile[i,"Resistance"]) {
result[i,] <- cbind("long", datafile[i, "date"], datafile[i, "close"])
}
}
result
trade trade.date trade.price
1 long 2001-01-02 1015.79
2 long 2001-01-03 1043.74
3 long 2001-01-04 1034.66
4 long 2001-01-05 1046.99
5 long 2001-01-08 1033.98
您可以完全避免循环,如下所示:
result = data.frame(trade="long",
datafile[datafile$close < datafile$Resistance, c("date","close")])
这是使用dplyr
包的另一个选项,如果你有一个大数据框,那将非常快(@ agstudy的data.table
版本也是如此):
library(dplyr)
result = datafile %>%
filter(close < Resistance) %>%
mutate(trade="long") %>%
select(trade, date, close)
答案 1 :(得分:3)
此处无需使用while-loop
。这是一个data.table解决方案。
library(data.table)
setDT(datafile)[close<Resistance,list(trade="long",date,close)]
# trade date close
# 1: long 2001-01-02 1016
# 2: long 2001-01-03 1044
# 3: long 2001-01-04 1035
# 4: long 2001-01-05 1047
# 5: long 2001-01-08 1034
PS:我只是使用data.table来表示糖语法功能。