2013-09-16 2 views
3

Если я хочу преобразовать строку в POSIXlt, там что-то не так, но я не могу понять, в чем проблема.Использование объектов времени времени в кадре данных

df<-data.frame(a=c("2013-07-01 11:51:03" ,"2013-07-01 12:01:50", "2013-07-01 12:05:13"),b=1:3) 
#factor(df[,"a"]) 
df[,"a"]<-as.POSIXlt(as.character(df[,"a"]),origin = "1960-01-01",tz="GMT") 

> Warning message: 
In `[<-.data.frame`(`*tmp*`, , "a", value = list(sec = c(3, 50, : 
9 variables declared, to replace 1 variablen 

df<-data.frame(a=c("2013-07-01 11:51:03" ,"2013-07-01 12:01:50", "2013-07-01 12:05:13"),b=1:3) 
df$a<-as.POSIXlt(as.character(df[,"a"]),origin = "1960-01-01",tz="GMT") 
factor(df[,"a"]) 
> Error in sort.list(y) : 'x' should be atomar for 'sort.list' 

До сих пор я использую работу вокруг как

a<-as.POSIXlt(as.character(df[,"a"]),origin = "1960-01-01",tz="GMT") 
df1<-data.frame(a,df[,"b"]) 

ответ

5

Я рекомендую использовать POSIXct:

df[,"a"]<-as.POSIXct(as.character(df[,"a"]),tz="GMT") 

Если вы должны использовать POSIXlt (почему?):

df$a <- as.POSIXlt(as.character(df[,"a"]),tz="GMT") 

Проблема в том, что объекты класса POSIXlt - фактически списки. $<- может справиться с этим правильно, [<- не может.

+0

+1 Я не знал, что '$ <- 'может иметь дело со списками. –

+0

Многие thx, почему 'df $ a <-as.POSIXlt (as.character (df [," a "]), origin =" 1960-01-01 ", tz =" GMT "); factor (df [, "a"]) 'также вызывает ошибку, как я показываю в начале сообщения? – Heiko

+0

Потому что 'factor' ожидает атомный вектор, который не является объектом' POSIXlt'. – Roland

3

POSIXlt хранит все в виде списка, который Мессинг вас ....

x <- as.POSIXlt(as.character(df[,"a"]),origin = "1960-01-01",tz="GMT") 

attributes(x[1]) 
$names 
[1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst" 

$class 
[1] "POSIXlt" "POSIXt" 

$tzone 
[1] "GMT" 

# See how the list is of the first element is of length 9? Hence the error: 
unlist(x[1]) 
# sec min hour mday mon year wday yday isdst 
# 3 51 11  1  6 113  1 181  0 

# POSIXct doesn't do this.... 
y <- as.POSIXct(as.character(df[,"a"]),origin = "1960-01-01",tz="GMT") 

attributes(y[1]) 
$class 
[1] "POSIXct" "POSIXt" 

$tzone 
[1] "GMT" 

# Stores the date/time as a single element 
unlist(y[1]) 
#[1] "2013-07-01 11:51:03 GMT" 
Смежные вопросы