2

data.frameの列の1つは「文字」です。
例:9:56:53PM2012年3月31日

/> class(columnName)  
[1] "character"

/>ttable[,c(3)] <- as.POSIXlt(ttable[,c(3)],tz="GMT", format="%H:%M:%S %p %m/%d/%Y")    

/>class(columnName)     
[1] "numeric"    

私はそれがposixltであると期待します、しかしそれは数値であることがわかります。それをposixltにする方法は?

列の実際の値に同じ命令を適用すると、期待どおりに機能しますか?

/> dd <- as.POSIXlt("9:56:53 PM 3/31/2012",tz="GMT", format="%H:%M:%S %p %m/%d/%Y")  

/> class(dd)  
[1] "POSIXlt" "POSIXt" 
4

1 に答える 1

3

まず、いくつかのデータを作成し、問題を再現しましょう。あなたが言及しなかった警告に注意してください:

ttable <- data.frame(x=1:2, y=1:2, z="9:56:53 PM 3/31/2012",
                     stringsAsFactors = FALSE)
ttable
#   x y                    z
# 1 1 1 9:56:53 PM 3/31/2012
# 2 2 2 9:56:53 PM 3/31/2012
ttable[, c(3)] <- as.POSIXlt(ttable[,c(3)], tz="GMT",
                                            format="%H:%M:%S %p %m/%d/%Y") 
# Warning message:
# In `[<-.data.frame`(`*tmp*`, , c(3), value = list(sec = c(53, 53 :
#   provided 9 variables to replace 1 variables
sapply(ttable, class)
#         x         y         z 
# "integer" "integer" "numeric" 

@joranが指摘したよう?DateTimeClassesに、問題は、as.POSIXlt長さ9(秒、分、時間など)のベクトルのリストを返すことです。現在の「幅」が1であるため、このリストを代わりに割り当てることはできません。代わりに、または:ttable[,c(3)]を介してdata.frame列全体(またはリスト要素)を再割り当てする必要があります。ttable[[3]]ttable$z

ttable <- data.frame(x=1:2, y=1:2, z="9:56:53 PM 3/31/2012",
                     stringsAsFactors = FALSE)
ttable[[3]] <- as.POSIXlt(ttable[,c(3)], tz="GMT",
                                         format="%H:%M:%S %p %m/%d/%Y") 
sapply(ttable, class)
# $x
# [1] "integer"
# 
# $y
# [1] "integer"
# 
# $z
# [1] "POSIXlt" "POSIXt"

リストをdata.frameの列として割り当てることは、あまり一般的なことではありません。この同様の例が役立つ場合があります。

ttable[, 1] <- list(a = 1:3, b = 3:1)
# Warning messages: [...]
ttable$x <- list(a = 1:3, b = 3:1)
#         x y                   z
# 1 1, 2, 3 1 2012-03-31 09:56:53
# 2 3, 2, 1 2 2012-03-31 09:56:53
于 2012-04-29T00:16:47.907 に答える