r-使用不同格式格式化日期列(包括缺少的日期信息)-lubridate



我对R相对陌生。我下载了一个关于临床试验数据的数据集,但我突然想到,t相对列中的日期格式混淆了:大多数都像"2012年9月1日";,但有些人错过了当天的信息(例如2015年10月(。

我想用同样的方式表达它们(例如yyyy-mm-dd(,与它们一起工作。一切顺利,唯一缺少的问题是输出列的名称。在最后一个函数(date_correction(中,我计划包含一个参数";输出_ col";我可以传递创建(格式化(列的预期名称,但它始终只打印output_col

  1. 你知道吗,我该怎么处理?要将输出列的预期名称直接传递到函数中吗
  2. 有更好的方法来解决我的问题吗?->我甚至尝试管理更复杂的润滑订单参数:parse_date_time

parse_date_time(input_col, orders="mdy", "my")

但这并没有奏效。

这是代码:

library("tidyverse")
library("lubridate")
Observation <- c(seq(1:5))
Date_original <- c("October 2014","August 2014","June 2013",
"June 24, 2010","January 2005")
df_dates <- data.frame(Observation, Date_original)
# looking for a comma in the cell
comma_detect <- function(a_string){
str_detect(a_string, ",")
}
# if comma: assume "mdy", if not apply "my" -> return formatted value
date_correction_row <- function(input_col){
if_else(comma_detect(input_col),
parse_date_time(input_col, orders="mdy"),
parse_date_time(input_col, orders="my"))
}
# prepare function for dataframe:
date_correction <- function(df, input_col, output_col){
mutate(df, output_col = date_correction_row(input_col))
}
df_dates %>% date_correction(df_dates$Date_original, date_formatted) %>% view()
OUTPUT
Observation Date_original output_col
1           1  October 2014 2014-10-01
2           2   August 2014 2014-08-01
3           3     June 2013 2013-06-01
4           4 June 24, 2010 2010-06-24
5           5  January 2005 2005-01-01

在下面的代码中,我们假设output_col等于"Date"。它们都设置了列名,不发出任何警告,并使用Date类。

1(尝试每种格式,选择不给出NA的格式。这只使用基本R。

output_col <- "Date"
within(df_dates, assign(output_col, pmin(na.rm = TRUE,
as.Date(Date_original, "%B %d, %Y"), 
as.Date(paste(Date_original, 1), "%B %Y %d"))))
##   Observation Date_original       Date
## 1           1  October 2014 2014-10-01
## 2           2   August 2014 2014-08-01
## 3           3     June 2013 2013-06-01
## 4           4 June 24, 2010 2010-06-24
## 5           5  January 2005 2005-01-01

2(这也可以在lubrigate中完成。重要的是,my是第一个而不是第二个合并的参数,因为它为那些与格式不匹配的值输出NA,而mdy给出了错误的日期,所以如果是第一个合并,就永远不会到达my。这种方法比(3(短,但你可能更喜欢健壮性(3(,因为它不取决于为不匹配的日期返回什么。

library(dplyr)
library(lubridate)
output_col <- "Date"
df_dates %>% 
mutate(!!output_col := coalesce(my(Date_original, quiet = TRUE), 
mdy(Date_original)))
##   Observation Date_original       Date
## 1           1  October 2014 2014-10-01
## 2           2   August 2014 2014-08-01
## 3           3     June 2013 2013-06-01
## 4           4 June 24, 2010 2010-06-24
## 5           5  January 2005 2005-01-01

3(如果您更喜欢自己的第一次检查逗号的方法,这里有一个更紧凑的变体。它使用mymdy而不是parse_date_time,因为mymdy给出的Date类结果在这里比parse_date_time的POSIXct更合适,因为没有时间。

library(dplyr)
library(lubridate)
output_col <- "Date"
df_dates %>%
mutate(!!output_col := if_else(grepl(",", Date_original),
mdy(Date_original), my(Date_original, quiet = TRUE)))
## 1           1  October 2014 2014-10-01
## 2           2   August 2014 2014-08-01
## 3           3     June 2013 2013-06-01
## 4           4 June 24, 2010 2010-06-24
## 5           5  January 2005 2005-01-01

当日期结构已知时,我喜欢先显式更正日期结构,然后进行解析。在这里,当缺少一天时,我使用regex来sub-in1,然后我们像正常一样进行解析。

library(tidyverse)
df_dates %>% 
mutate(
output_col = gsub("(?<!,)\s(?=\d{4})", " 1, ", Date_original, perl = TRUE) %>% 
as.Date(., format = '%B %d, %Y')
)
Observation Date_original output_col
1           1  October 2014 2014-10-01
2           2   August 2014 2014-08-01
3           3     June 2013 2013-06-01
4           4 June 24, 2010 2010-06-24
5           5  January 2005 2005-01-01

最新更新