将am和pm值转换为数字值

时间:2016-02-25 07:20:02

标签: r

我有以下数据框:

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

关于它出错的任何想法?

1 个答案:

答案 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