随着时间的推移,我有每个人(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"
我希望将TimeStart
和TimeFinish
设置为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
非常感谢任何帮助。谢谢!
答案 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