我想在R中转换超过24小时的小时。
例如,我有一个包含小时和分钟的数据框,如[HH:MM]:
[1]“111:15”“221:15”“111:15”“221:15”“42:05”
我希望他们能在几个小时内完成这样的转换:
“111.25”“221.25”“111.25”“221.25”“42.08333333”
as.POSIXct()
功能适用于一般用途,但不能超过24小时。
答案 0 :(得分:2)
您可以使用strsplit
拆分字符串,然后使用sapply
转换所有值。
vec <- c("111:15", "221:15", "111:15", "221:15", "42:05")
sapply(strsplit(vec, ":"), function(x) {
x <- as.numeric(x)
x[1] + x[2] / 60
})
结果:
[1] 111.25000 221.25000 111.25000 221.25000 42.08333
答案 1 :(得分:0)
我只是用正则表达式解析字符串。在:
之前抓住该位,然后在:
除以60之后加上该位
> foo = c("111:15", "221:15", "111:15", "221:15", "42:05")
> foo
[1] "111:15" "221:15" "111:15" "221:15" "42:05"
> as.numeric(gsub("([^:]+).*", "\\1", foo)) + as.numeric(gsub(".*:([0-9]{2})$", "\\1", foo))/60
[1] 111.25000 221.25000 111.25000 221.25000 42.08333
答案 2 :(得分:0)
另一种可能性是矢量化函数,例如:
FUN <- function(time){
hours <- sapply(time,FUN=function(x) as.numeric(strsplit(x,split=":")[[1]][1]))
minutes <- sapply(time,FUN=function(x) as.numeric(strsplit(x,split=":")[[1]][2]))
result <- hours+(minutes/60)
return(as.numeric(result))
}
使用strsplit
提取小时和分钟的地方,然后将分数除以60后得到总和。
然后你可以使用这样的函数:
FUN(c("111:15","221:15","111:15","221:15","42:05"))
[1] 111.25000 221.25000 111.25000 221.25000 42.08333
答案 3 :(得分:0)
strapplyc 这是我在gsubfn package中使用strapplyc
的解决方案。它将匹配传递给每个带括号的正则表达式(即小时和分钟)到第三个参数中描述的函数。该函数可以使用通常的R函数表示法指定,它还支持使用公式(此处使用)的简短形式,其中公式的右侧是函数体,左侧表示参数,默认为自由右侧的变量(m
,h
)。我们假设原始字符向量是ch
。
library(gsubfn)
strapply(ch, "(\\d+):(\\d+)", ~ as.numeric(h) + as.numeric(m)/60, simplify = TRUE)
数字处理另一种方法是用a替换:并以数字方式操纵它到我们想要的东西:
num <- as.numeric(chartr(":", ".", ch))
trunc(num) + 100 * (num %% 1) / 60
sub 这是另一种方法:
h <- as.numeric(sub(":.*", "", ch))
m <- as.numeric(sub(".*:", "", ch))
h + m / 60
上面的代码给出了一个数字结果,但如果需要字符结果,我们可以将每个代码包装在as.character(...)
中。
<强>函数read.table 强>
as.matrix(read.table(text = ch, sep = ":")) %*% c(1, 1/60)
<强> EVAL /解析即可。这一个将每一个操作成一个R表达式,并对其进行评估。这个很短,但eval
的使用常常令人不悦:
sapply(parse(text = sub(":", "+(1/60)*", ch)), eval)
添加其他解决方案。