Изменить весь формат даты в датафрейме - PullRequest
0 голосов
/ 13 февраля 2019

Я очень плохо знаком с программированием на R и вроде как застрял в этом: у меня есть фрейм данных, и я хочу проверить, есть ли какое-либо значение в любой из строк / столбцов в формате даты, должно быть удалено только во временную часть,Например, строка даты "2015-01-02 10:15:44" должна быть изменена на "10:15:44"

Я знаю, это очень новый подход, но вот что я пытаюсь взять подстроку всех значений.

id<-c(1,2,3,4)
time1<-c("2015-01-02 10:15:44","NA","2015-11-12 00:15:44","2015-01-02 12:15:14")
time2<-c("NA", "2015-01-02 10:15:44","NA","2015-11-12 00:15:44")
..
..
timen ....
print(df)

df<-data.frame(id,time1, time2,..., timen)
df[1:4 ,2: ncol(df)] <- substring(df[1:4 ,2: ncol(df)], 12)
print(df)

Может кто-нибудь, пожалуйста, предложить выход?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

вы пробовали пакет lubridate:

time_cols <- c("time1", "time2")

df[time_cols] <- apply(df[time_cols], 2, 
                       function(col){
                          format(lubridate::ymd_hms(col), "%H:%M:%S")
                       })
df
#     id    time1    time2
#   1  1 10:15:44     <NA>
#   2  2     <NA> 10:15:44
#   3  3 00:15:44     <NA>
#   4  4 12:15:14 00:15:44
0 голосов
/ 13 февраля 2019

Проход по столбцам и подстрока :

df[, 2:3] <- lapply(df[, 2:3], substring, first = 12)
df
#   id    time1    time2
# 1  1 10:15:44         
# 2  2          10:15:44
# 3  3 00:15:44         
# 4  4 12:15:14 00:15:44  

# input data
df <- data.frame(id = c(1,2,3,4),
                 time1 = c("2015-01-02 10:15:44","NA","2015-11-12 00:15:44","2015-01-02 12:15:14"),
                 time2 = c("NA", "2015-01-02 10:15:44","NA","2015-11-12 00:15:44"))
0 голосов
/ 13 февраля 2019

Попробуйте это: df1 содержит ваши данные.После этой манипуляции вы можете рекомбинировать с исходными данными.

    target<-unlist(sapply(stringr::str_extract_all(names(df1),"^t.*"),"["))
       Changed<-as.data.frame(sapply(target,function(x){ind=which(names(df1)==x)
       unlist(sapply(stringr::str_split(df1[,ind]," "),"[",2))}))
cbind(id=df1$id,Changed)

Вывод:

       id    time1    time2
       1    10:15:44     <NA>
       2     <NA>      10:15:44
       3   00:15:44       <NA>
       4    12:15:14 00:15:44
...