data.frame的一列是“character” 例如:2012年3月31日晚上9:56:53
/> 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"
答案 0 :(得分: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(秒,分钟,小时等)的向量列表。无法分配此列表来代替ttable[,c(3)]
,因为其当前“宽度”为1.而是必须通过ttable[[3]]
或{{1}重新分配整个data.frame列(或列表元素) }:
ttable$z
将列表指定为data.frame的列并不常见。这个类似的例子可能有所帮助:
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"