从类'字符'更改数据框的多个列上课时间'使用chron

时间:2017-04-05 22:16:26

标签: r for-loop lapply

我有一个包含多列的数据框,其中一些我需要更改为' time'使用chron的类,以便我可以检索基本统计信息。这些列当前存储为字符,格式如下:hh:mm。

以下是它的一个子集以及需要更改的列的列表:

    > Data
     DATE FLT TYPE    REG   AC  DEP  ARR   STD   STA   ATD   ATA
1 15-01-02 953   J  C-GCPT 73M  YVQ  YEV  12:00 12:55 13:00 13:59
2 15-01-04 953   J  C-GCPT 73M  YVQ  YEV  12:00 12:55 13:17 14:13
3 15-01-05 953   J  C-GCPT 73M  YVQ  YEV  12:00 12:55 13:20 14:14

Time_list <-c("STD","STA","ATD","ATA")

以下是我仅更改一列(并且可以正常工作)所做的工作:

    Data$ATA <- paste0(Data$ATA, ':00')
    Data$ATA<-chron(times.=Data$ATA)

    class(Data$ATA)
    [1] "times"

但是,我希望能够同时执行所有列,因为它们中有很多列。我尝试了多种技术,有些似乎适用于第一部分,即粘贴&#39:00&#39;但是第二部分总是出错,使用chron。我似乎有一个我不明白的长度问题

  1. 使用dmap

    Data[,Time_list]<-
      Data%>%
      select(one_of(Time_list)) %>%
      dmap(paste0,':00')
    
    Data[,Time_list]<-
      Data %>%
      select(one_of(Time_list)) %>%
      dmap(chron,times.=Data[,Time_list])
    
    **Error in .f(.d[[i]], ...) : 
      .d[[i]] and Data[, Time_list] must have equal lengths**
    
  2. 使用apply

    YEVdata[,(Time_list)] <- lapply(YEVdata[,(Time_list)], paste0,':00')
    Data[,(Time_list)] <- lapply(Data[,(Time_list)], chron, times. =Data[,(Time_list)])
    **Error in FUN(X[[i]], ...) : 
      X[[i]] and Data[, (Time_list)] must have equal lengths**
    
  3. 使用for循环

  4. 我尝试使用for循环,但我只是一个初学者,可以到任何地方。

    1. 使用&#34;简单&#34;来自另一个Stack Overflow问题的解决方案。
    2. 它只是弄得一团糟,甚至粘贴。

      Efficiently transform multiple columns of a data frame

      用普通初学者语言提出的任何想法都将非常感激!如果可以嵌套这两个操作,那就更好了!

1 个答案:

答案 0 :(得分:0)

dplyr::mutate_at适用于这种情况。您可以定义要变异的变量,然后定义要使用的函数。

您可以使用funs表示法和嵌套函数在.内的单个步骤中粘贴和转换为时间。

library(dplyr)
Data = mutate_at(Data, Time_list, funs(chron(times. = paste0(., ":00"))))