data.frame的一列是“字符”
例如: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"
最佳答案
首先,让我们创建一些数据并重现您的问题。请注意您没有提到的警告:
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。相反,必须通过以下方式重新分配整个 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
关于r - 如何将数据框的字符列转换为Posixlt类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10368524/