дата из 3 разных переменных в кадре данных - PullRequest
0 голосов
/ 10 мая 2018

У меня есть три столбца для дня, месяца и года, которые я хочу использовать для создания одного столбца даты

> dt
    mon day year
 1:  NA  NA   NA
 2:  NA  NA   NA
 3:  NA  NA   NA
 4:  NA  NA   NA
 5:  NA  NA   NA
 6:  NA  NA   NA
 7:  NA  NA   NA
 8:  10  10 2017
 9:  NA  NA   NA
10:   4   4 2018
11:  NA  NA   NA
12:  NA  NA   NA
13:  NA  NA   NA
14:  NA  NA   NA
15:  NA  NA   NA
16:  NA  NA   NA
> 

Я использовал приведенный ниже код, который дает странные результаты:

> as.Date(paste(dt$mon,dt$day,dt$year,sep="-"),format = "%m-%d-%y")
 [1] NA           NA           NA           NA           NA           NA           NA          
 [8] "2020-10-10" NA           "2020-04-04" NA           NA           NA           NA          
[15] NA

Я также попробовал ниже:

library("lubridate")
with(dt, ymd(sprintf('%04d%02d%02d', year, mon, day)))

здесь я получаю ошибку: Ошибка в sprintf ("% 04d% 02d% 02d", год, понедельник, день): недопустимый формат "% 04d";использовать формат% f,% e,% g или% a для числовых объектов

Пожалуйста, предложите, если что-то не так с этими кодами или есть лучшее решение для моей проблемы?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Единственное различие между этим решением и уже опубликованными замечательными заключается в том, что я попытался отразить структуру, которую вы использовали, сохранив with и ymd, и просто исправил ошибку при правильном соединении строки.

library(lubridate)
dt <- data.frame(mon = c(10, 4), day = c(10, 4), year = c(2017, 2018))

with(dt, ymd(paste(year, mon, day, sep = "-")))
#> [1] "2017-10-10" "2018-04-04"

Создано в 2018-05-10 пакетом представ. (v0.2.0).

0 голосов
/ 10 мая 2018

Это больше дополнение к ответу, данному @Giovana, но если мы объединяем дату, используя формат год-месяц-день с тире, нам даже не нужно передавать строку формата в as.Date:

dt$date <- as.Date(paste(dt$year, dt$mon, dt$day, sep="-"))

Проверьте здесь для краткой демонстрации с использованием вышеуказанной логики.

0 голосов
/ 10 мая 2018

Мы могли бы использовать anytime

library(anytime)
anydate(do.call(paste, dt))

Если это data.table

dt[, date := anydate(do.call(paste, .SD))]
0 голосов
/ 10 мая 2018

Ваш год в 4-значном формате.

Так что вы должны использовать% Y

as.Date(paste(dt$mon,dt$day,dt$year,sep="-"),format = "%m-%d-%Y")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...