0

I'm trying to convert date field of 3 datasets using for loop and got the error:

Error in as.Date.default(mydatasets[i]$Date, "%Y-%m-%d") : do not know how to convert 'mydatasets[i]$Date' to class “Date”

Here's the code:

papel_BBD <-read.csv("http://ichart.finance.yahoo.com/table.csv?s=BBD",sep=",", header=1)
papel_HSBC <-read.csv("http://ichart.finance.yahoo.com/table.csv?s=HSBC",sep=",", header=1)
papel_ITAU <-read.csv("http://ichart.finance.yahoo.com/table.csv?s=ITUB",sep=",", header=1)


mydatasets <- c(papel_BBD, papel_HSBC, papel_ITAU)

for (i in 1:length(mydatasets)) {
  mydatasets[i]$Date <- as.Date(mydatasets[i]$Date, "%Y-%m-%d")
}

Console:

for (i in 1:length(mydatasets)) {
  mydatasets[i]$Date <- as.Date(mydatasets[i]$Date, "%Y-%m-%d")
}

Error in as.Date.default(mydatasets[i]$Date, "%Y-%m-%d") : do not know how to convert 'mydatasets[i]$Date' to class “Date”

I think I'm missing something in this line inside the for loop:

mydatasets[i]$Date <- as.Date(mydatasets[i]$Date, "%Y-%m-%d")

Thanks

Jaap
  • 81,064
  • 34
  • 182
  • 193

2 Answers2

1

We can use lapply with the correct format (based on the urls) for the 'Date' column.

lst <- lapply(mget(ls(pattern='^papel\\_.*')), transform, 
               Date=as.Date(Date))
lapply(lst, head, 2)
#$papel_BBD
#        Date Open High  Low Close   Volume Adj.Close
#1 2015-11-13 5.64 5.68 5.51  5.58 15207900      5.58
#2 2015-11-12 5.61 5.78 5.59  5.64 11032800      5.64

#$papel_HSBC
#        Date  Open  High   Low Close  Volume Adj.Close
#1 2015-11-13 39.07 39.18 38.85 38.92 1922600     38.92
#2 2015-11-12 39.75 39.86 39.53 39.57 2020700     39.57

#$papel_ITAU
#        Date Open High  Low Close   Volume Adj.Close
#1 2015-11-13 7.36 7.41 7.11  7.14 15996600      7.14
#2 2015-11-12 7.36 7.51 7.30  7.36 14638300      7.36

It is better to keep the datasets in the list itself. If we need to reflect the changes in the original dataset, we can use list2env (not recommended though)

list2env(lst, envir=.GlobalEnv)

str(papel_BBD)
#'data.frame':   3346 obs. of  7 variables:
# $ Date     : Date, format: "2015-11-13" "2015-11-12" ...
# $ Open     : num  5.64 5.61 5.81 5.5 5.67 5.69 5.69 5.82 5.51 5.48 ...
# $ High     : num  5.68 5.78 5.81 5.75 5.71 5.83 5.85 5.86 5.86 5.55 ...
# $ Low      : num  5.51 5.59 5.63 5.41 5.53 5.61 5.65 5.61 5.51 5.38 ...
# $ Close    : num  5.58 5.64 5.81 5.65 5.6 5.83 5.81 5.67 5.83 5.53 ...
# $ Volume   : int  15207900 11032800 19484900 13652300 17659600 11074400 12065900 16797400 24521100 17566100 ...
# $ Adj.Close: num  5.58 5.64 5.81 5.65 5.6 ...
akrun
  • 874,273
  • 37
  • 540
  • 662
0

Try this

for(i in length(mydatasets)){
    if(is.factor(mydatasets[[i]])){
        mydatasets[[i]] <- as.Date(mydatasets[[i]])
    }
}

str(mydatasets)

## $ Date     : Date[1:3346], format: "2015-11-13" "2015-11-12" "2015-11-11" "2015-11-10" ...
## $ Open     : num [1:3346] 5.64 5.61 5.81 5.5 5.67 5.69 5.69 5.82 5.51 5.48 ...
## $ High     : num [1:3346] 5.68 5.78 5.81 5.75 5.71 5.83 5.85 5.86 5.86 5.55 ...
## $ Low      : num [1:3346] 5.51 5.59 5.63 5.41 5.53 5.61 5.65 5.61 5.51 5.38 ...
## $ Close    : num [1:3346] 5.58 5.64 5.81 5.65 5.6 5.83 5.81 5.67 5.83 5.53 ...
## $ Volume   : int [1:3346] 15207900 11032800 19484900 13652300 17659600 11074400 12065900 16797400 24521100 17566100 ...
## $ Adj.Close: num [1:3346] 5.58 5.64 5.81 5.65 5.6 ...
## $ Date     : Date[1:4111], format: "2015-11-13" "2015-11-12" "2015-11-11" "2015-11-10" ...
## $ Open     : num [1:4111] 39.1 39.8 39.9 39.5 40.3 ...
## ...
narendra-choudhary
  • 4,582
  • 4
  • 38
  • 58