我有一个包含多列的数据框,其中一些我需要更改为' 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
。我似乎有一个我不明白的长度问题
使用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**
使用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**
使用for
循环
我尝试使用for循环,但我只是一个初学者,可以到任何地方。
它只是弄得一团糟,甚至粘贴。
Efficiently transform multiple columns of a data frame
用普通初学者语言提出的任何想法都将非常感激!如果可以嵌套这两个操作,那就更好了!
答案 0 :(得分:0)
dplyr::mutate_at
适用于这种情况。您可以定义要变异的变量,然后定义要使用的函数。
您可以使用funs
表示法和嵌套函数在.
内的单个步骤中粘贴和转换为时间。
library(dplyr)
Data = mutate_at(Data, Time_list, funs(chron(times. = paste0(., ":00"))))