将h:min:sec:毫秒转换为分钟:R中的秒数

时间:2017-03-20 06:13:52

标签: r

随着时间的推移,我有每个人(ID)的效果数据,作为一个因素导入到R中。一个例子是:

head(df, 4)
    TimeStart     TimeFinish    ID                  
1   0:00:00:08    0:00:12:06    1          
2   0:05:35:02    0:05:55:05    1      
3   0:13:33:01    0:13:53:03    2     
4   0:19:26:02    0:19:46:08    2 

> sapply(df, class)
  TimeStart  TimeFinish     ID       
"factor"    "factor"    "factor"    

我希望将TimeStartTimeFinish设置为minutes.seconds格式的数字。不需要毫秒精度。小时也不是必需的。我想用数字格式的数据进行绘图。我想要的输出是:

 head(df, 4)
    TimeStart     TimeFinish    ID                  
1   0.0           0.12          1          
2   5.35          5.55          1      
3   13.33         13.53         2     
4   19.26         19.46         2 

非常感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:2)

看起来我们只需要一个字符串转换。循环浏览感兴趣的列,使用gsub删除小时和毫秒部分,将:替换为.并转换为numeric

df[1:2] <- lapply(df[1:2], function(x) 
       as.numeric(sub(":", ".", gsub("^[^:]+:|:[^:]+$", "", x))))
df
#  TimeStart TimeFinish ID
#1      0.00       0.12  1
#2      5.35       5.55  1
#3     13.33      13.53  2
#4     19.26      19.46  2

答案 1 :(得分:2)

lapply的另一个选项。我们将时间因素格式转换为POSIXct类,并使用format仅提取它的分钟和秒部分,然后将其转换为数字。

df[1:2] <- lapply(df[1:2], function(x) 
                as.numeric(format(as.POSIXct(x, format = "%H:%M:%OS"), "%M.%S")))

df
#  TimeStart TimeFinish ID
#1      0.00       0.12  1
#2      5.35       5.55  1
#3     13.33      13.53  2
#4     19.26      19.46  2

答案 2 :(得分:1)

使用strsplit按“:”拆分字符串并循环输出,并按“。”折叠第2和第3个元素。使用paste()并将其分配回df数据框。

df[, 1:2] <- lapply(df[, 1:2], function( x){
  lapply( strsplit( as.character(x), ":" ), function( x ) paste( x[2:3], collapse = "." ))
} )
#   TimeStart TimeFinish ID
# 1     00.00      00.12  1
# 2     05.35      05.55  1
# 3     13.33      13.53  2
# 4     19.26      19.46  2