r - 如何从数据库中过滤日期数字、不完整日期和 NA 并转换为 r 中的统一日期类

标签 r date dplyr

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

这是我原来的数据库:

enter image description here

这就是我需要的最终结果:

enter image description here

我设法做的是使用虚构的列过滤数据集,并将日期转换为所需的格式。这就是我所做的:

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 列。

最佳答案

您可以对场景使用 do 条件并应用不同的函数来转换为日期。

代码

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

关于r - 如何从数据库中过滤日期数字、不完整日期和 NA 并转换为 r 中的统一日期类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75118785/

相关文章:

r - OR 条件如何在 R 中工作?

用于检查日期是否接近今天的 SQL 查询

r - 合并行并保留基于另一列的值

php - 需要一个循环发送功能的想法

java - Android 中的 TextView inputType 日期 - 它是如何工作的?

r - R(dplyr)中的Left Join-观察太多?

r - 如果按特定顺序包含多个变量,则进行子集化

r - 如何在R中的ggplot中使log10仅第一个y轴(而不是第二个y轴)

r - 使用 tidyverse 和 sapply 在列表上创建一个函数

r - 单击按钮后在 Shiny 应用程序的主面板中显示文本