Saya memiliki kumpulan data dengan lebih dari 50 kolom tanggal. Saat mengimpor dataset ke R menggunakan fungsi fread atau csv-semua kolom tanggal diformat sebagai kolom karakter. Meskipun saya dapat menghabiskan setengah hari, mengonversi setiap kolom pada satu waktu, saya pikir beberapa pakar R mungkin telah menemukan cara yang lebih baik untuk mengonversi format sejumlah besar kolom sekaligus.

Apakah ada cara yang efisien untuk mengubah daftar kolom menjadi kolom yang diformat dengan benar dalam satu gerakan?

Data dummy saya adalah sebagai berikut:

enter image description here

r
1
Prajwal Mani Pradhan 12 Mei 2021, 22:18

3 jawaban

Jawaban Terbaik

Diperbarui Saya ingin mengucapkan terima kasih kepada Mr. @Gregor Thomas karena telah menawarkan tip berharga untuk ditambahkan ke solusi saya. Kami berasumsi bahwa semua kolom tanggal Anda memiliki akhiran date sehingga kami dapat memberi tahu fungsi across untuk hanya menerapkan transformasi Tanggal pada kolom tersebut.

library(dplyr)

df %>%
  mutate(across(ends_with("date"), ~ as.Date(.x, format = "%m/%d/%Y")))

# A tibble: 2 x 4
     id generic_name index_date ami_pre_date
  <dbl> <chr>        <date>     <date>      
1     1 ato          2016-10-27 2015-10-20  
2     2 sim          2017-07-12 2026-05-01 

Data

structure(list(id = c(1, 2), generic_name = c("ato", "sim"), 
    index_date = c("10/27/2016", "7/12/2017"), ami_pre_date = c("10/20/2015", 
    "5/1/2026")), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"))
3
Anoushiravan R 12 Mei 2021, 19:40

Kita bisa menggunakan anydate

library(anytime)
library(dplyr)
df  %>% 
  mutate(across(contains('date'), anydate))
# A tibble: 2 x 4
#     id generic_name index_date ami_pre_date
#  <dbl> <chr>        <date>     <date>      
#1     1 ato          2016-10-27 2015-10-20  
#2     2 sim          2017-07-12 2026-05-01  
1
akrun 12 Mei 2021, 19:43

Solusi base Rdengan lapply:

df[grepl("date$", names(df))] <- lapply(df[grepl("date$", names(df))], function(x) as.Date(x, format = "%m/%d/%Y"))

Hasil:

df
# A tibble: 2 x 4
     id generic_name index_date ami_pre_date
  <dbl> <chr>        <date>     <date>      
1     1 ato          2016-10-27 2015-10-20  
2     2 sim          2017-07-12 2026-05-01 

Data: (terima kasih kepada @Anoushiravan)

df <- structure(list(id = c(1, 2), generic_name = c("ato", "sim"), 
    index_date = c("10/27/2016", "7/12/2017"), ami_pre_date = c("10/20/2015", 
    "5/1/2026")), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"))
1
Chris Ruehlemann 12 Mei 2021, 19:32