我想将excel文件中的2,3和4位数字更改为小时和分钟格式,数字之间不带点。例如我有83和114和1159。我想在r中编写一个函数,该函数可以将右边的前两位数字视为分钟,将第三位和第四位视为小时,因此对于114,该功能应将14视为分钟,然后将1视为小时,其他数字相同。
为澄清起见,我的问题是如何将83、141更改为不带点141 = 0141和83 = 0123的小时和分钟
谢谢 塞勒姆
答案 0 :(得分:0)
这是一个非常具体的函数,我不知道这是否是最好的方法,但是它将读取右边的任何两位数字(最小值)和左边的任何两位数字(hrs)。如果分钟数超过60,则会将其添加到总时数中。
extractTime.c<-function(list_char){
Test_Char<-as.character(list_char)
a1 <- as.matrix(Test_Char) ;
a2 <- strsplit(a1, "") ;
Data_List<-list()
List_Length<-length(a2)
for(i in 1:List_Length){
Char_Length<-length(a2[[i]])
if(Char_Length==2){
min1<-a2[[i]][1]
min2<-a2[[i]][2]
MIN<-paste(min1,min2, sep="")
MIN<-as.numeric(MIN)
HR=0
if(MIN/60 > 1){
Tot_Hrs<-MIN/60
Tot_Hrs_Char<-as.character(Tot_Hrs)
Percent_Hr<-regmatches(Tot_Hrs_Char, gregexpr("\\W\\d\\d"
, Tot_Hrs_Char, perl=TRUE))
Percent_Hr<-as.numeric(Percent_Hr)
MIN<-Percent_Hr*60
MIN<-round(MIN)
HR<-regmatches(Tot_Hrs_Char, gregexpr("\\d+\\W"
, Tot_Hrs_Char, perl=TRUE))
HR<-regmatches(HR,gregexpr("\\d+", HR, perl=T))
HR<-as.numeric(HR)
}else if(MIN/60==1){
HR=HR+1
MIN=0
}else{
HR=0
}
Time<-data.frame(HR,MIN)
Data_List[[i]] <-Time
}else if(Char_Length==3){
hr1<-a2[[i]][1]
min1<-a2[[i]][2]
min2<-a2[[i]][3]
MIN<-paste(min1,min2,sep="")
hr1<-as.numeric(hr1)
MIN<-as.numeric(MIN)
if(MIN/60 > 1){
Tot_Hrs<-MIN/60
Tot_Hrs_Char<-as.character(Tot_Hrs)
Percent_Hr<-regmatches(Tot_Hrs_Char, gregexpr("\\W\\d\\d"
, Tot_Hrs_Char, perl=TRUE))
Percent_Hr<-as.numeric(Percent_Hr)
MIN<-Percent_Hr*60
MIN<-round(MIN)
HR<-regmatches(Tot_Hrs_Char, gregexpr("\\d+\\W"
, Tot_Hrs_Char, perl=TRUE))
HR<-regmatches(HR,gregexpr("\\d+", HR, perl=T))
HR<-as.numeric(HR)
hr1<-as.numeric(hr1)
HR<-(HR+hr1)
}else if(MIN/60==1){
HR=hr1+1
MIN=0
}else{
HR<-hr1
}
Time<-data.frame(HR,MIN)
Data_List[[i]] <-Time
}else if (Char_Length==4){
hr1<-a2[[i]][1]
hr2<-a2[[i]][2]
min1<-a2[[i]][3]
min2<-a2[[i]][4]
MIN<-paste(min1,min2, sep="")
HROG<-paste(hr1,hr2, sep="")
MIN<-as.numeric(MIN)
if(MIN/60 > 1){
Tot_Hrs<-MIN/60
Tot_Hrs_Char<-as.character(Tot_Hrs)
Percent_Hr<-regmatches(Tot_Hrs_Char, gregexpr("\\W\\d\\d"
, Tot_Hrs_Char, perl=TRUE))
Percent_Hr<-as.numeric(Percent_Hr)
MIN<-Percent_Hr*60
MIN<-round(MIN)
HR<-regmatches(Tot_Hrs_Char, gregexpr("\\d+\\W"
, Tot_Hrs_Char, perl=TRUE))
HR<-regmatches(HR,gregexpr("\\d+", HR, perl=T))
HR<-as.numeric(HR)
HROG<-as.numeric(HROG)
HR<-(HR+HROG)
}else if(MIN/60==1){
HR=HROG+1
MIN=0
}else{
HR<-HROG
}
Time<-data.frame(HR,MIN)
Data_List[[i]] <-Time
}else{}
}
Fin_DF<-do.call(rbind.data.frame, Data_List)
return(Fin_DF)
}
然后我们调用上面编写的函数...
Test<-c(183,1225,12,1001,260)
A<-extractTime.c(Test)
> A
HR MIN
1 2 23
2 12 25
3 0 12
4 10 1
5 3 0