首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用POSIXlt对象替换列值

用POSIXlt对象替换列值
EN

Stack Overflow用户
提问于 2013-10-04 07:27:50
回答 2查看 4.4K关注 0票数 1

考虑以下R代码,它用一组POSIXct值替换数据帧一列中的值:

代码语言:javascript
复制
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时,为什么相同的操作会失败?例如:

代码语言:javascript
复制
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

此外,如果我按名称(而不是按索引)引用该列,则相同的赋值效果很好:

代码语言:javascript
复制
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

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-04 09:01:38

来自help("[.data.frame")

对于[替换值可以是一个列表:列表中的每个元素用于替换(部分)一个列,根据需要回收列表。

所以你可以这样做:

代码语言:javascript
复制
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

然而,这导致了一个警告:

代码语言:javascript
复制
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个元素的列表:

代码语言:javascript
复制
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)
票数 5
EN

Stack Overflow用户

发布于 2013-10-04 07:59:28

POSIXlt对象似乎是列表,有9个条目。

代码语言:javascript
复制
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对象未列出。

代码语言:javascript
复制
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

另一方面,对列表的分配是有效的。

代码语言:javascript
复制
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 <- bar
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19175638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档