无法格式化数据框中的日期

时间:2015-06-06 22:40:28

标签: r date

我在数据帧(“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

2 个答案:

答案 0 :(得分:4)

在您的代码中,c(trade, as.Date(trade.date), trade.price)会创建一个包含三个值的向量。向量的所有元素必须属于同一个类,因此Rtrade.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来表示糖语法功能。