【问题标题】:R lubridate: only showing last element in new variableR lubridate:仅显示新变量中的最后一个元素
【发布时间】:2014-02-09 20:30:50
【问题描述】:

恐怕还有一个新手问题。我正在尝试使用“lubridate”创建新变量,但遇到了 3 个问题。

我从一个以 H:MM:SS 或 HH:MM:SS 格式导入的变量“时间”开始。我还创建了“timeC”作为角色。

1.显示问题

    temp$time2 <- hms(temp$time) #take my original variable "time" and convert

问题:屏幕上只显示“time2”的秒部分,尽管“在引擎盖下”看起来是正确的:

 time2
 ----
  4

> temp$time2[1,]
[1] "7H 0M 4S"

2.提取小时数问题

     temp$hour <- hour(temp$time2) #extract just the hours portion

问题:这会间歇性地工作;有时很好,有时我得到以下错误:

Error in as.POSIXlt.character(as.character(x), ...) : 
   character string is not in a standard unambiguous format

这让我很担心,因为这看起来不像是 lubridate 应该抛出的那种信息。

3.提取小时和分钟问题

temp$hourMins <- hm(temp$time2)

问题:hourMins 的每个值都是“NA”

我可能已经花费了 4 多个小时试图解决这个问题,并且想知道是否还有其他软件包可以支持我正在尝试做的事情。

任何建议将不胜感激。提前致谢和问候!

【问题讨论】:

  • 我认为您将字符串解析为时间(即hms()hm())与从该时间提取组件(hours()minutes()seconds())混淆了
  • @hadley - 你是对的(就像你一样);仍然掌握 R 文档的窍门:完整,但有时很难说出“什么重要”以及哪些内容在日常使用中/不重要。

标签: r lubridate


【解决方案1】:

首先,制作一个“玩具”数据用于说明,

require(lubridate)
temp <- data.frame(time=factor(c("01:01:01","02:02:02","03:03:03")))
temp$time2 <- hms(temp$time)
temp

##       time    time2
## 1 01:01:01 1H 1M 1S
## 2 02:02:02 2H 2M 2S
## 3 03:03:03 3H 3M 3S

1) 显示问题

你需要attach

attach(temp)
## The following objects are masked from temp (position 3):

##     time, time2

time2
## [1] "1H 1M 1S" "2H 2M 2S" "3H 3M 3S"

## detach(temp) # after final use.

否则,time2 是环境中已经存在的变量,而不是temp 的列。

编辑:您可以与str 联系以查看您的time2 中的确切内容。

str(time2)
## Formal class 'Period' [package "lubridate"] with 6 slots
##   ..@ .Data : num [1:3] 1 2 3
##   ..@ year  : num [1:3] 0 0 0
##   ..@ month : num [1:3] 0 0 0
##   ..@ day   : num [1:3] 0 0 0
##   ..@ hour  : num [1:3] 1 2 3
##   ..@ minute: num [1:3] 1 2 3

如果您的time2 具有类似的结构,但在您键入time2 时仅显示“秒”部分,这意味着您的此类对象的打印功能已被意外覆盖。

2) 提取小时数问题

temp$hour <- hour(temp$time2)

没问题

3) 提取小时和分钟问题

time3 <- gsub("^(.+):[^:]+$","\\1",as.character(temp$time))
time3
## [1] "01:01" "02:02" "03:03"

hm(time3)
## [1] "1H 1M 0S" "2H 2M 0S" "3H 3M 0S"

或者也可以直接使用 {hms} 来包含秒数,

hms(temp$time)
## [1] "1H 1M 1S" "2H 2M 2S" "3H 3M 3S"

【讨论】:

  • 嗨,@xb。 - 谢谢你的快速反应。好消息:当我尝试您的代码 1) 如下: > xb
  • @user2621147,您是否按照我上面的编辑中的建议尝试了str
  • 我也不确定我是否与仅间歇工作的“小时”分享您的舒适:-)
  • Nooooooooooooo,不要使用附加。
  • @hadley 虽然我不是attach 的粉丝,但是当本地环境的范围很明确时,它很方便且无害。并且我确实在关闭时提到了detach
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 2014-11-01
相关资源
最近更新 更多