将选择字符变量转换为R中数据框中的时间

时间:2018-03-30 18:51:40

标签: r chron

我正在尝试将当前字符的数据框中的多个变量更改为时间。 我只使用

从csv文件中导入了我想要的变量
ids_dates_times <- read.csv("filename", header=TRUE, na.strings=c(".",NA),
                            stringsAsFactor = FALSE, 
                            colClasses="character")[,c(1,3,8,9,10,15,16,17,22,23,24,29,30,31,36,37,38,43,44,45,50,51)]

ids_dates_times的示例(这只是前4个变量,注意有14个需要转换为时间):

       id_phresh   D1_Date    D1_Bed_Time  D1_Wake_Time
  1      1097      9/3/2016    15:16:00      8:59:00
  2      1098      7/22/2016    2:00:00      6:30:00
  3      2005      8/25/2016   23:00:00      6:00:00
  4      2007      7/9/2016     1:00:00      7:00:00
  5      2013      6/23/2016   23:45:00      8:35:00

我希望我的下一行代码能够将所选列转换为时间。

times <- chron(times.= ids_dates_times[,c(3,4,6,7,9,10,12,13,15,16,18,19,21,22)], format = "hh:mm:ss")

我收到以下错误

  

convert.times(times。,fmt)出错:格式hh:mm:ss可能不正确

我尝试了以下内容:

itimes <- which(sapply(DF, function(x) all(grepl(":.*:", x))))
DF[itimes] <- lapply(DF[itimes], times)
idates <- which(sapply(DF, function(x) all(grepl("/.*/", x))))
DF[idates] <- lapply(DF[idates], dates)

导致:

str(lapply(DF, class))

List of 22 $ id_phresh : chr "character" $ D1_Date : chr "character" $ D1_Bed_Time : chr "character" $ D1_Wake_Time: chr "character"

这应该是日期和时间,而不是性格,对吗? 任何帮助都会很棒!

1 个答案:

答案 0 :(得分:0)

假设DF在最后的注释中可重复显示,那么如果我们事先知道时间和日期列的索引,即下面的itimesidates已知,那就是:

library(chron)

itimes <- 3:4
DF[itimes] <- lapply(DF[itimes], times)
idates <- 2
DF[idates] <- lapply(DF[idates], dates)

,并提供:

> str(lapply(DF, class))
List of 4
 $ id_phresh   : chr "integer"
 $ D1_Date     : chr [1:2] "dates" "times"
 $ D1_Bed_Time : chr "times"
 $ D1_Wake_Time: chr "times"

或者我们可以将itimesidates计算为具有两个的列:和两个/分别运行上面的列。 lapply陈述。

itimes <- which(sapply(DF, function(x) all(grepl(":.*:", x))))
DF[itimes] <- lapply(DF[itimes], times)

idates <- which(sapply(DF, function(x) all(grepl("/.*/", x))))
DF[idates] <- lapply(DF[idates], dates)

或者,我们可以像这样使用一个lapply:

DF[] <- lapply(DF, function(x) {
  if (all(grepl(":.*:", x))) x <- times(x)
  if (all(grepl("/.*/", x))) x <- dates(x)
  x
})

注意

Lines <- "
       id_phresh   D1_Date    D1_Bed_Time  D1_Wake_Time
  1      1097      9/3/2016    15:16:00      8:59:00
  2      1098      7/22/2016    2:00:00      6:30:00
  3      2005      8/25/2016   23:00:00      6:00:00
  4      2007      7/9/2016     1:00:00      7:00:00
  5      2013      6/23/2016   23:45:00      8:35:00"
DF <- read.table(text = Lines, as.is = TRUE)