我已经使用RStudio将一个csv文件导入到R中,我试图用每场比赛的分数来计算每场比赛的得分。但是每场比赛的分钟数格式为mm:ss,我很难找到如何将其转换为十进制形式。
请帮忙!
答案 0 :(得分:25)
鉴于您从字符向量开始,这相对容易:
minPerGame <- c("4:30","2:20","34:10")
sapply(strsplit(minPerGame,":"),
function(x) {
x <- as.numeric(x)
x[1]+x[2]/60
}
)
给出
[1] 4.500000 2.333333 34.166667
请务必检查您使用read.csv()
选项as.is=TRUE
。否则,您必须使用as.character()
进行转换。
答案 1 :(得分:9)
你需要十进制吗?如果以正确的格式存储数据,例如作为类POSIXlt
的对象(R的日期时间类之一),R将以数字方式处理时间的正确处理。这是我的意思的一个例子:
首先我们创建一些虚拟数据用于说明目的:
set.seed(1)
DF <- data.frame(Times = seq(as.POSIXlt("10:00", format = "%M:%S"),
length = 100, by = 10),
Points = cumsum(rpois(100, lambda = 1)))
head(DF)
忽略这里有日期的事实,当我们进行绘图时它被有效地忽略,因为所有观察具有相同的日期部分。接下来,我们使用R的公式接口绘制它:
plot(Points ~ Times, data = DF, type = "o")
产生这个:
答案 2 :(得分:2)
对第一个解决方案的一些调整:
minPerGame <- paste(sample(1:89,100000,T),sample(0:59,100000,T),sep=":")
f1 <- function(){
sapply(strsplit(minPerGame,":"),
function(x) {
x <- as.numeric(x)
x[1]+x[2]/60
}
)
}
#
f2<- function(){
w <- matrix(c(1,1/60),ncol=1)
as.vector(matrix(as.numeric(unlist(strsplit(minPerGame,":"))),ncol=2,byrow=TRUE)%*%w)
}
system.time(f1())
system.time(f2())
system.time(f1())用户系统已用完 0.88 0.00 0.86
system.time(f2())用户系统已用完 0.25 0.00 0.27
答案 3 :(得分:0)
我有这样的数据:
这似乎对我有用:
my_df <- my_df %>%
separate(col = eventTime, into = c("H", "M", "S"), sep = "\\:", remove = FALSE) %>%
separate(col = S, into = c("S", "Z"), sep = "\\+", remove = TRUE) %>%
separate(col = Z, into = c("ZH", "ZM"), sep = 2, remove = TRUE) %>%
mutate(H = as.numeric(H)/24) %>%
mutate(M = as.numeric(M)/24/60) %>%
mutate(S = as.numeric(S)/24/60/60) %>%
mutate(ZH = as.numeric(ZH)/24) %>%
mutate(ZM = as.numeric(ZM)/24/60) %>%
mutate(H = H-ZH) %>%
mutate(M = M-ZM) %>%
mutate(time_num = H+M+S)
小时:小时, M:分钟, S:秒, Z:区域, ZH:区时, ZM:区域分钟
如果你不关心时区,那么这个:
my_df <- my_df %>%
separate(col = eventTime, into = c("H", "M", "S"), sep = "\\:", remove = FALSE) %>%
separate(col = S, into = c("S", "Z"), sep = "\\+", remove = TRUE) %>%
mutate(H = as.numeric(H)/24) %>%
mutate(M = as.numeric(M)/24/60) %>%
mutate(S = as.numeric(S)/24/60/60) %>%
mutate(time_num = H+M+S)
第一种方法你可能会得到否定的结果。第二种方法应该得到 0 到 1 之间的值,其中 time_num 是一天中的一部分。
例如:
22:49:20+1100 = 0.950925926
07:26:10+1100 = 0.309837963