考虑以下R代码,它用一组POSIXct值替换数据帧一列中的值:
foo <- as.data.frame(list(bar=rep(5,5)))
bar <- as.POSIXct(rep(5,5), origin="1970-1-1", tz="c")
foo[,1] <- bar我的问题是:当我尝试使用POSIXlt时,为什么相同的操作会失败?例如:
foo <- as.data.frame(list(bar=rep(5,5)))
bar <- as.POSIXlt(rep(5,5), origin="1970-1-1", tz="c")
foo[,1] <- bar
Warning message:
In `[<-.data.frame`(`*tmp*`, , 1, value = list(sec = c(5, 5, 5, :
provided 9 variables to replace 1 variables此外,如果我按名称(而不是按索引)引用该列,则相同的赋值效果很好:
foo$bar <- bar
foo <- as.data.frame(list(bar=rep(5,5)))
bar <- as.POSIXlt(rep(5,5), origin="1970-1-1", tz="c")
foo$bar <- bar我遗漏了什么?
发布于 2013-10-04 09:01:38
来自help("[.data.frame"):
对于[替换值可以是一个列表:列表中的每个元素用于替换(部分)一个列,根据需要回收列表。
所以你可以这样做:
df <- data.frame(a=1:2)
df[,2:3] <- list(3:4, 5:6)
# a V2 V3
#1 1 3 5
#2 2 4 6然而,这导致了一个警告:
df[,4] <- list(7, 8)
# Warning message:
# In `[<-.data.frame`(`*tmp*`, , 4, value = list(7, 8)) :
# provided 2 variables to replace 1 variables
# a V2 V3 V4
# 1 1 3 5 7
# 2 2 4 6 7现在,POSIXlt对象是一个包含9个元素的列表:
unclass(rep(as.POSIXlt(Sys.time()), 2))
# $sec
# [1] 1.958244 1.958244
#
# $min
# [1] 54 54
#
# $hour
# [1] 10 10
#
# $mday
# [1] 4 4
#
# $mon
# [1] 9 9
#
# $year
# [1] 113 113
#
# $wday
# [1] 5 5
#
# $yday
# [1] 276 276
#
# $isdst
# [1] 1 1
#
# attr(,"tzone")
# [1] "" "CET" "CEST"使用[<-.data.frame将此列表分配给一列将给出您所观察到的警告。
这个问题的潜在解决办法很简单:
POSIXct并避免使用POSIXlt。使用后一种方法的唯一原因是需要提取一些列表组件,这通常不是这样的(而且您总是可以强制使用POSIXlt,例如,用于舍入时间值的内部函数)。$<-.data.frame。在交互使用之外,这通常是很麻烦的。POSIXlt对象包装在一个list中,以便分配:df[,1] <- list(POSIXlt_object)。发布于 2013-10-04 07:59:28
POSIXlt对象似乎是列表,有9个条目。
unlist(as.POSIXlt(5, origin="1970-1-1"))
sec min hour mday mon year wday yday isdst
5 0 1 1 0 70 4 0 0
unlist(as.POSIXct(5, origin="1970-1-1"))
[1] "1970-01-01 00:00:05 CET"显然,分配给data.frame的任务失败,因为POSIXlt对象未列出。
foo <- as.data.frame(list(bar=rep(5,5)))
bar <- as.POSIXlt(rep(5,5), origin="1970-1-1", tz="")
foo[,1] <- bar # this fails
foo[,1:9] <- bar # this works另一方面,对列表的分配是有效的。
foo <- as.data.frame(list(bar=rep(5,5)))
bar <- as.POSIXlt(rep(5,5), origin="1970-1-1", tz="")
foo[[1]] <- bar # or foo$bar <- barhttps://stackoverflow.com/questions/19175638
复制相似问题