首先,让我们创建一些数据并复制您的问题。需要注意的警告,你没有提到:
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
返回长度为九(秒,分钟,小时等)的载体列表。此列表可以不到位的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
你在做'columnName < - ttable [,3]; ttable [,3] < - as.POSIXlt(...);类(列名)'?在这种情况下,请注意,当'ttable [,3]''时,'columnName'不会改变,因为R不能像那样工作。你可以直接转换'columnName',或者在*转换'ttable [,3]'之后*然后做'columnName' < - 'ttable [,3]'并重新测试它的类。 (另外,'ttable'是数据框还是矩阵/数组?) – 2012-04-29 00:06:01
@ mathematical.coffee ColumnName只是表示列的名称。没有对列名执行操作。感谢您的编辑。 – 2sb 2012-04-30 15:14:47