Изменение символа в формат даты после проверки ввода другого столбца / строки - PullRequest
0 голосов
/ 24 мая 2019

У меня есть набор данных с тремя полями. Я хотел бы заменить любую строку, в которой есть «Ежегодный», на соответствующую дату.

данные:

df <- structure(list(`Grants Period Month` = c("Annual", "01-2014-12", 
"Annual", "Annual", "01-2013-06", "Annual"), `Due Date` = structure(c(16525, 
16437, 16160, 17256, 15888, 16160), class = "Date"), `Late/Timely Flag` = c("On-Time", 
"Late", "Late", "Late", "On-Time", "Late")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))
#here's a look at my data
# A tibble: 6 x 2
 `Grants Period Month` `Due Date`    `Late/Timely Flag`
  <chr>                <date>            <chr>         
1 Annual               2015-03-31       On-Time    
2 01-2014-12           2015-01-02        Late          
3 Annual               2014-03-31        Late             
4 Annual               2017-03-31        Late             
5 01-2013-06           2013-07-02       On-Time   
6 Annual               2014-03-31        Late

Я хотел бы изменить любую строку с записью «Ежегодно» на запись даты выполнения этой конкретной строки.

#Expected result
# A tibble: 6 x 2
 `Grants Period Month` `Due Date`    `Late/Timely Flag`
  <chr>                <date>            <chr>         
1 2015-03-31           2015-03-31       On-Time    
2 01-2014-12           2015-01-02        Late          
3 2014-03-31           2014-03-31        Late             
4 2017-03-31           2017-03-31        Late             
5 01-2013-06           2013-07-02       On-Time   
6 2014-03-31           2014-03-31        Late

Ответы [ 2 ]

1 голос
/ 24 мая 2019
library(dplyr)
mutate(df, `Grants Period Month` = ifelse(`Grants Period Month` == "Annual",
                                                    as.character(`Due Date`), 
                                                      `Grants Period Month`))

Первое использование df %>% janitor::clean_names().Это даст вам чистые имена и приведенный выше код, и в целом ваши данные станут более разборчивыми с этими новыми именами.

ОБНОВЛЕНИЕ

Я пошел быстро и грязно, никаких обратных галочек,делать с мобильного телефона ... Вот мое мнение о правильной клавиатуре и R сессии.Имейте в виду, что все даты, которые не удалось проанализировать, будут преобразованы в срок.Я также добавил новые данные в новые столбцы вместо перезаписи.

df <- structure(list(`Grants Period Month` = c("Annual", "01-2014-12", "Annual", "Annual", "01-2013-06", "Annual"), `Due Date` = structure(c(16525, 16437, 16160, 17256, 15888, 16160), class = "Date"), `Late/Timely Flag` = c("On-Time", "Late", "Late", "Late", "On-Time", "Late")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))


    library(dplyr)
    df %>%
      mutate(grants_period = lubridate::myd(`Grants Period Month`),
             due_date = lubridate::ymd(`Due Date`)) %>%
      mutate(new_col=ifelse(is.na(grants_period),
                                  due_date,
                                  grants_period)) %>%
      mutate(new_col = lubridate::as_date(new_col))

, что приводит к

# A tibble: 6 x 6
  `Grants Period Month` `Due Date` `Late/Timely Flag` grants_period due_date   new_col   
  <chr>                 <date>     <chr>              <date>        <date>     <date>    
1 Annual                2015-03-31 On-Time            NA            2015-03-31 2015-03-31
2 01-2014-12            2015-01-02 Late               2014-01-12    2015-01-02 2014-01-12
3 Annual                2014-03-31 Late               NA            2014-03-31 2014-03-31
4 Annual                2017-03-31 Late               NA            2017-03-31 2017-03-31
5 01-2013-06            2013-07-02 On-Time            2013-01-06    2013-07-02 2013-01-06
6 Annual                2014-03-31 Late               NA            2014-03-31 2014-03-31
1 голос
/ 24 мая 2019

Вы могли бы сделать что-то вроде

# df is your data frame
is_annual <- df[["Grants Period Month"]] == "Annual"
df[["Grants Period Month"]][is_annual] <- as.character(df[["Due Date"]][is_annual])
...