我對 R 比較陌生。我下載了一個關于臨床試驗資料的資料集,但我突然想到,相關列中日期的格式是混淆的:其中大多數都像“2012 年 9 月 1 日”,但有些缺少當天資訊(例如 2015 年 10 月)。
我想以相同的方式表達它們(例如 yyyy-mm-dd),以便與它們一起作業。一切順利,唯一缺少的問題是輸出列的名稱。在最后一個函式(date_correction)中,我計劃包含一個引數“output_col”,我可以為創建的(格式化的)列傳遞預期的名稱,但它始終只列印 output_col。
- 你知道,我怎么能處理這個?要將輸出列的預期名稱直接傳遞給函式?
- 有沒有更好的方法來解決我的問題?-> 我什至嘗試為 lubricate::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
uj5u.com熱心網友回復:
在下面的代碼中,我們假設output_colequals "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)這也可以在 lubridate 中完成。重要的是 my 是 coalesce 的第一個引數而不是第二個引數,因為它為那些與格式不匹配的值輸出 NA,而 mdy 給出了錯誤的日期,所以如果這是第一個 coalesce 將永遠不會到達 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)如果您更喜歡自己的首先檢查逗號的方法,這里是更緊湊的方法的變體。它使用myandmdy而不是parse_date_timesincemy并mdy給出 Date 類結果,這比 POSIXct 更合適,parse_date_time因為沒有時間。
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
uj5u.com熱心網友回復:
當日期結構已知時,我喜歡先顯式更正日期結構,然后再決議。在這里,當一天丟失時,我使用正則運算式來 sub in 1,然后我們像往常一樣決議。
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/529016.html
標籤:r功能日期润滑变异
