Преобразование дат в столбце фрейма данных R

У меня возникают проблемы с преобразованием столбца импортированных дат в фрейме данных, представленного в виде символов в другом формате даты, в объекты даты в том же фрейме данных. Вот пример игрушки:

xx <- data.frame(A = c(10, 15, 20), B = c("10/15/2010", "9/8/2015", "8/5/2013"))

Если я напечатаю xx,

   A          B
1 10 10/15/2010
2 15   9/8/2015
3 20   8/5/2013

Я применяю:

xx[, "B"] <- sapply(xx[, "B"], function(x) {as.Date(x, 
           format = "%m/%d/%Y", origin = "1970-01-01")})

и я получаю:

   A     B
1 10 14897
2 15 16686
3 20 15922

Если я посмотрю на режим столбца B, он будет числовым, а не датой. Что бы я ни пытался, я не могу получить результат, который преобразует столбец B в тип даты. Я всегда могу добавить:

xx[, "B"] <- as.Date(xx[, "B"]) 

но должен быть способ сделать это в одном выражении.


person Ernie    schedule 16.11.2019    source источник
comment
Это создаст серию зоопарка: library(zoo); B <- read.zoo(xx, index = "B", format = "%m/%d/%Y") Это преобразует ее во фрейм данных fortify.zoo(B)   -  person G. Grothendieck    schedule 16.11.2019


Ответы (1)


Если у вас есть только один столбец для преобразования, вы можете сделать

xx$B <- as.Date(xx$B, "%m/%d/%Y")

Если у вас несколько столбцов, используйте lapply вместо sapply.

cols <- 2
xx[cols] <- lapply(xx[cols], as.Date, "%m/%d/%Y")

Или используя lubridate, где вам не нужно указывать аргумент формата.

xx$B <- lubridate::mdy(xx$B)
person Ronak Shah    schedule 16.11.2019
comment
Виноват. В моем примере показан только один столбец, но на самом деле у меня есть вектор имен столбцов во фрейме данных, который я конвертирую, поэтому моя функция sapply на самом деле выглядит так: xx[, vector_of_names] ‹- sapply(xx[, vector_of_names], fun.. .... - person Ernie; 16.11.2019
comment
@ Эрни, да, я обновил ответ на lapply. Теперь он должен работать для нескольких столбцов. xx[vector_of_names] <- lapply(xx[vector_of_names], as.Date, "%m/%d/%Y") - person Ronak Shah; 16.11.2019