我有以下数据框:
Time <- c("10am", "12pm", "3pm")
df <- data.frame(Time)
Iam正在寻找一种方法来改变10点10点和下午2点(数值)。
因此我写了以下代码:
df$Time <- as.character(df$Time)
for(i in 1:nrow(df)){
if(grepl("am",df$Time[i])){
x <- strsplit(df$Time[i], "am")
first_element <- function(x){x[1]}
df$Time[i] <- first_element(x)
df$Time[i] <- as.numeric(x)
}
else {
df$Time[i] <- as.character(df$Time[i])
x <- strsplit(df$Time[i], "pm")
first_element <- function(x){x[1]}
df$Time[i] <- first_element(x)
df$Time[i] <- as.numeric(x)
settime <- function(time){
df$Time[i] <- time + 12
return(df$Time[i])
}
df$Time[i] <- df$Time[i]
}
}
这似乎适用于上午但不适用于下午。它产生以下错误:
Error in strsplit(df$Time[i], "pm") : non-character argument
关于它出错的任何想法?
答案 0 :(得分:1)
我们可以使用sub
分隔'时间'中的数字和非数字字符,使用read.table
('d1')创建一个双列数据集,然后使用ifelse
来在'V2'中添加12个'V1'元素,对应'V2','V1'中的'pm'小于12。
d1 <- read.table(text=sub('(\\d+)(\\D+)', "\\1 \\2",
Time), header=FALSE, stringsAsFactors=FALSE)
with(d1, ifelse(V2=='pm' & V1 <12, V1+12, V1))
#[1] 10 12 15
或者我们可以使用strptime
as.numeric(format(strptime(Time, "%I%p"), '%H'))
#[1] 10 12 15