我的数据集中有一列包含00:20:10
格式的时间。我有两个问题。首先,当我使用read.xlsx2()
将其导入R时,此列将转换为因子类型。如何将其转换为时间类型?
其次,我想以分钟数计算每个人的总时间。
ID Time
1 00:10:00
1 00:21:30
2 00:30:10
2 00:04:10
我想要的输出是:
ID Total.time
1 31.5
2 34.3
我以前没有处理过时间问题,我希望有人会推荐一些包。
答案 0 :(得分:5)
您可以使用 chron 包中的times()
将Time
列转换为"次"类。然后aggregate()
将时间相加,按ID
列分组。第一个块将在结果中给出实际时间。
library(chron)
df$Time <- times(df$Time)
aggregate(list(Total.Time = df$Time), df[1], sum)
# ID Total.Time
# 1 1 00:31:30
# 2 2 00:34:20
对于十进制输出,我们可以使用minutes()
和seconds()
,也可以使用 chron 。
aggregate(list(Total.Time = df$Time), df[1], function(x) {
minutes(s <- sum(x)) + (seconds(s) / 60)
})
# ID Total.Time
# 1 1 31.50000
# 2 2 34.33333
此外,我们还可以使用 data.table 来提高效率。
library(data.table)
setDT(df)[, .(Total.Time = minutes(s <- sum(Time)) + (seconds(s) / 60)), by = ID]
# ID Total.Time
# 1: 1 31.50000
# 2: 2 34.33333
数据:强>
df <- structure(list(ID = c(1L, 1L, 2L, 2L), Time = structure(c(2L,
3L, 4L, 1L), .Label = c("00:04:10", "00:10:00", "00:21:30", "00:30:10"
), class = "factor")), .Names = c("ID", "Time"), class = "data.frame", row.names = c(NA,
-4L))