我正在尝试解决一个问题,一开始看起来非常简单,但我发现自己陷入困境。 所以,我有一个名为“out”的对象:
out<-c( " 59mn 59s", " 59mn 59s", " 1h 0mn", " 1h 0mn", " 1h 0mn", " 1h 0mn", " 1h 0mn", " 1h 0mn", " 59mn 59s"," 59mn 59s", " 46mn 42s")
我的最终目标是使用包lubridate中的函数“hms”将字符转换为时间对象。问题是数据集不一致,在某些情况下我有几分钟和几分钟,其他我有几分钟和几秒钟。所以我尝试统一数据集如下:
out<-for(p in 1:length(out)) {
ifelse(!grepl("h",out[p]),paste("0h",out[p]),ifelse(!grepl("mn",out[p]),paste("0h 0mn",out[p]),ifelse(!grepl("s",out[p]),paste(out[p],"0s"))))
}
ifelse语句本身工作正常但是在for循环中它只返回NULL。 有没有人知道这段代码出了什么问题? 另一种选择是来自lubridate的“hm”和“hms”功能的组合,但我的技能将不允许我走这条路。
非常感谢
答案 0 :(得分:2)
由于ifelse
是矢量化的,因此您可以在不使用循环的情况下执行此操作:
ifelse(!grepl("h",out), paste("0h",out),
ifelse(!grepl("mn",out), paste("0h 0mn",out),
ifelse(!grepl("s",out), paste(out,"0s"), NA)))
#[1] "0h 59mn 59s" "0h 59mn 59s" " 1h 0mn 0s" " 1h 0mn 0s" " 1h 0mn 0s" " 1h 0mn 0s" " 1h 0mn 0s"
#[8] " 1h 0mn 0s" "0h 59mn 59s" "0h 59mn 59s" "0h 46mn 42s"
这是你所期望的吗?
(请注意,我添加了NA
,其他所有条件都不为TRUE,并且out[p]
内的ifelse
仅替换为out
。)
答案 1 :(得分:2)
使用更安全的正则表达式。
t<-c( " 59mn 59s", " 59mn 59s", " 1h 0mn", " 1h 0mn", " 1h 0mn", " 1h 0mn", " 1h 0mn", " 1h 0mn", " 59mn 59s"," 59mn 59s", " 46mn 42s")
t[grep(" [0-9]{2}mn", t)] = paste( "0h", t[grep(" [0-9]{2}mn", t)], sep="")
t[grep("mn$", t)] = paste(t[grep("mn$", t)], " 0s", sep ="")
hms(t)
> [1] "59M 59S" "59M 59S" "1H 0M 0S" "1H 0M 0S" "1H 0M 0S" "1H 0M 0S" "1H 0M 0S"
> [8] "1H 0M 0S" "59M 59S" "59M 59S" "46M 42S"