Объединение данных из двух столбцов в один формат даты изменения - PullRequest
0 голосов
/ 17 мая 2018

В кадре данных два столбца (fech_A и fech_B) содержат даты смерти по разным причинам.

   fech_A  fech_B  
1 8-02-06    <NA>  
2    <NA> 8-11-18  
3 9-03-14    <NA>  
4 9-03-05    <NA>  
5    <NA> 9-08-11  

Я хочу объединить даты без NA в новый столбец, fech_C. С ответом в ранее опубликованном комментарии, мой код

fech_A <- as.Date(c("8-02-06",NA,"9-03-14","9-03-05",NA),format="%d/%m/%Y")
fech_B <- as.Date(c(NA,"8-11-18",NA,NA,"9-08-11"),format="%d/%m/%Y")
calend1 <- data_frame(fech_A,fech_B)
fech_C <- with(calend1,ifelse(is.na(fech_A),fech_A,fech_B)

Но новый столбец отображается в числовом формате:

[1] -716570 -716284 -716168 -716177 -716018

Как мне отформатировать данные в новом столбце, чтобы они отображались в виде дат?

Ответы [ 3 ]

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

Вы можете сделать это с построчным применением.Я переписал ваш пример, чтобы исправить ошибки:

fech_A <- as.Date(c("8-02-06",NA,"9-03-14","9-03-05",NA),format="%d-%m-%y")
fech_B <- as.Date(c(NA,"8-11-18",NA,NA,"9-08-11"),format="%d-%m-%y")
calend1 <- data_frame(fech_A,fech_B)

apply(calend1, 1, function(x) if (is.na(x['fech_A'])) {
    x['fech_B']
} else {
    x['fech_A']
})

[1] "2006-02-08" "2018-11-08" "2014-03-09" "2005-03-09" "2011-08-09"

Я уверен, что есть лучший способ объединить столбцы вместе, но это работает чисто в базе R и apply учитывает типы данныхваши даты.

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

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

library(tidyverse)
calend1 %>% 
   transmute(new = coalesce(!!! rlang::syms(names(.))))
# A tibble: 5 x 1
#  new       
#   <date>    
#1 2006-02-08
#2 2018-11-08
#3 2014-03-09
#4 2005-03-09
#5 2011-08-09
0 голосов
/ 17 мая 2018

Если я правильно помню, проблема заключается в if else, которая обобщает вывод даты в целое число (потому что дата фактически сохраняется как целочисленное значение, а NA - это NA_integer_s.

Решение, которое я использую, чтобы обойти это, состоит в том, чтобы использовать пакет dplyr и использовать вместо него dplyr :: if_else. Разница между ними заключается в том, что dplyr :: if_else настаивает на том, что значения true и false имеют одинаковый тип, и, следовательно, если a иb - это определенно даты, тогда можно с уверенностью предположить, что выходные данные тоже являются датами.

Я подозреваю, что вы можете принудительно напечатать вывод с помощью as.Date () вокруг if if else, но у вас не было необходимости пробовать что-либотак, поскольку я использую опцию dplyr (что естественно для меня, так как я использую аккуратный стих для большей части обработки данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...