R语言 如何从数据库中过滤日期编号、不完整日期和NA并转换为统一的日期类

bvuwiixz  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(134)

我有一个大型数据库,其中的日期列包含来自Excel的日期数字,日期不完整,缺少年份(但年份在另一列中),以及一些缺少日期的单元格。我找到了如何更改日期的格式,但问题是如何过滤date变量中的三种类型的单元格(即Excel中的日期数字、不完整的日期和空单元格)。我设法通过一个创建的列(value)来过滤a,而真实的数据库中没有该列。
这是我的原始数据库:

这就是我想要的结果:

我所做的是用虚构的value列过滤数据集,并将date转换为所需的格式。

library(dplyr)

data_a <- read.csv(text = "
year,date,value
2018,43238,1
2017,43267,2
2020,7/25,3
2018,,4
2013,,5
2000,8/23,6
2000,9/21,7")

data_b <- data_a %>% 
  filter(value %in% c(1,2)) %>%
  mutate(data_formatted = as.Date(as.numeric(date), origin = "1899-12-30"))

data_c <- data_a %>%
  filter(value %in% c(3, 6, 7)) %>%
  mutate(data_formatted = as.Date(paste0(year, "/", date)))

data_d <- data_a %>% 
  filter(value %in% c(4, 5)) %>%
  mutate(data_formatted = NA)

data_final <- rbind(data_b, data_c, data_d)

我需要一次完成相同的操作,而不使用value列。

ljsrvy3e

ljsrvy3e1#

您可以对方案使用do conditional,并应用不同的函数来转换为date。
编号

library(dplyr)
library(stringr)
library(lubridate)

data_a %>% 
  mutate(
    data_formatted = case_when(
      !str_detect(date,"/") ~ as.Date(as.numeric(date), origin = "1899-12-30"),
      TRUE ~ ymd(paste0(year, "/", date))
    ) 
  )

输出

year  date value data_formatted
1 2018 43238     1     2018-05-18
2 2017 43267     2     2018-06-16
3 2020  7/25     3     2020-07-25
4 2018           4           <NA>
5 2013           5           <NA>
6 2000  8/23     6     2000-08-23
7 2000  9/21     7     2000-09-21
rvpgvaaj

rvpgvaaj2#

你试试看

data_a2 <- data_a %>% mutate(date2=as.numeric(ifelse(str_detect(date,'\\/'), '',date)), 
           date2_=as.numeric(as.Date(ifelse(str_detect(date,'\\/'), paste0(year,'/',date),''), format='%Y/%m/%d')),
           date_formatted=as.Date(coalesce(date2,date2_), origin = "1970-01-01")) %>% 
           dplyr::select(-date2,-date2_)

相关问题