2014-11-21 6 views
1

Мне интересно, почему возникает эта ошибка. Я хотел бы преобразовать это с помощью скобок, поскольку я делаю последовательные преобразования в цикле. И потому, что я просто хочу быть в состоянии сделать это и понять, что происходит.convert string data.frame to Date

head(clean.deposit.rates) 
     Date 
1 1/31/1983 
2 2/28/1983 
3 3/31/1983 
4 4/30/1983 
5 5/31/1983 
6 6/30/1983 

class(clean.deposit.rates) 
[1] "data.frame" 

class(as.Date(clean.deposit.rates[[1]], "%m/%d/%Y")) 
[1] "Date" 



    class(as.Date(clean.deposit.rates$Date, "%m/%d/%Y")) 
[1] "Date" 



as.Date(clean.deposit.rates["Date"], "%m/%d/%Y") 
    Error in as.Date.default(clean.deposit.rates["Date"], "%m/%d/%Y") : 
     do not know how to convert 'clean.deposit.rates["Date"]' to class “Date” 

ответ

2

Необходимо использовать два кронштейна [. С одним столбец остается в виде кадра данных. С два, становится атомарным вектором, который может быть правильно принят к правильной as.Date методы

as.Date(df["Date"], "%m/%d/%Y") 
# Error in as.Date.default(df["Date"], "%m/%d/%Y") : 
# do not know how to convert 'df["Date"]' to class “Date” 

С df["Date"] является классом data.frame, то x аргумента использует as.Date.default, потому что нет as.Date.data.frame метода. Ошибка срабатывает потому, что x является FALSE для всех if заявлений и продолжается as.Date.default линии

stop(gettextf("do not know how to convert '%s' to class %s", 
    deparse(substitute(x)), dQuote("Date")), domain = NA) 

Использование df[["Date"]], столбец становится вектором и передается либо as.Date.character или as.Date.factor в зависимости от класса вектора , и возвращается желаемый результат.

as.Date(df[["Date"]], "%m/%d/%Y") 
# [1] "1983-01-31" "1983-02-28" "1983-03-31" "1983-04-30" "1983-05-31" 
# [6] "1983-06-30" 
3

Если вы хотите сделать это для нескольких столбцов в одном кадре данных, а затем использовать функцию lapply. Что-то вроде:

colNames <- c('StartDate','EndDate') 

mydf[colNames] <- lapply(mydf[colNames], as.Date, "%m/%d/%Y") 
+0

(+1) Я думаю, что забыл упомянуть о петлевой части :) –