我有一个有时间的数据框。
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强制转换为矩阵不会导致问题 改变数据类型。你的例子是这样的。