使用apply将Lubridate对象转换为字符串

时间:2015-10-08 04:51:06

标签: r lubridate

我有一个有时间的数据框。

a <- c("00:51:00", "01:51:00")
b <- c("rando1", "rando2")
d <- c("06:20:00", "06:20:00")
e <- data.frame(a,b,d)
e$a <- hms(e$a) # convert times into lubridate objects
e$d <- hms(e$d)

所以e现在看起来像这样:

          a      b         d
1    51M 0S rando1 6H 20M 0S
2 1H 51M 0S rando2 6H 20M 0S

fun <- function(temp){
  #browser() # temp doesn't look like what its supposed to
  temp[["a"]] - temp[["d"]]
}
apply(e, 1, fun)

我想简单地为每行减去列d和列a,但在fun内部,temp看起来像这样:

       a           b           d 
"51M 0S"    "rando1" "6H 20M 0S" 

所以我不能只使用format参数来轻松地将它恢复到lubridate对象中。在复制这个例子时,我发现如果我调用以下行会出现另一个问题:

apply(e[,c("a","d")], 1, fun) # inside a and d are always 0?

这意味着,由于字符串列的存在,apply正在将lubridate对象强制转换为字符串。

似乎两种解决方案对我有用。一个是弄清楚如何使lubridate将第一个条目转换为"0H 28M 0S",以便格式化为常量。第二个看起来应该存在,是为了让lubridate识别格式并从字符串转换回日期时间对象。

如果这些都不可能,我将回到调查使用do.call作为建议的here,以便不将时间转换成字符串。从链接看起来似乎是因为所有列都不是同一类型,因此不是一个好的候选者:

  

有时候应用会起作用 - 就像所有args属于同一类型时一样   将data.frame强制转换为矩阵不会导致问题   改变数据类型。你的例子是这样的。

0 个答案:

没有答案