我有一个数据集(CSV),其中一列包含多种日期格式,可以是
|birth_date|
------------
|DD/MM/YYYY|
|YYYY-MM-DD|
| YYYY |
| [BLANK] |
我正在尝试将“ YYYY-MM-DD”格式的日期更改为“ DD / MM / YYYY”。到目前为止,我有以下代码:
# Loading in required libraries
library(tidyverse)
source("R/formatDate.R")
# Reading in the Nobel Prize data
data <- read_csv('datasets/data1.csv')
fixed_birthdates <- lapply(data["birth_date"], function(x) formatDate(x))$birth_date
data[["birth_date"]] <- fixed_birthdates
formatDate.R:
formatDate <- function(x) {
output <- x
if (grepl('-', x, fixed = TRUE)) {
xx <- strsplit(x,'-',TRUE)
output <- paste(xx[3],xx[2],xx[1],sep="/")
}
return(output)
}
但是,每次我运行它时,fixed_birthdates
的值都等于"c(\"1854\", \"03\", \"15\")/c(\"1839\", \"03\", \"16\")/c(\"1852\", \"08\", \"30\")"
。该变量有5个元素,而我的原始数据集中有969个。不知道为什么会这样。
我要实现的逻辑很简单,但是我不知道如何在R中表达它。使用c#代码看起来像这样:
string formatDate (string x)
{
string output = x;
if (x.Contains("-"))
{
string[] xx = x.Split('-');
output = xx[1]+'/'+xx[2]+'/'+xx[3];
}
return output;
}
答案 0 :(得分:3)
您可以尝试通过as.Date
进行格式化,然后覆盖成功解析的值。这是一个简单的示例:
data <- data.frame(
birth_date = c("01/01/2001", "2010-03-14", "1982", ""),
stringsAsFactors=FALSE
)
# birth_date
#1 01/01/2001
#2 2010-03-14
#3 1982
#4
frmtdate <- as.Date(data$birth_date, format="%Y-%m-%d")
data$birth_date[!is.na(frmtdate)] <- format(frmtdate[!is.na(frmtdate)], "%d/%m/%Y")
data
# birth_date
#1 01/01/2001
#2 14/03/2010
#3 1982
#4
答案 1 :(得分:1)
strsplit
的输出为list
。我们可以向量化,而不是遍历每个元素,但是可以通过用list
提取[[
元素来纠正OP的代码
formatDate <- function(x) {
output <- x
if (grepl('-', x, fixed = TRUE)) {
xx <- strsplit(x,'-',TRUE)
output <- paste(xx[[1]][3],xx[[1]][2],xx[[1]][1],sep="/")
}
return(output)
}
data[,"birth_date"] <- sapply(data[,"birth_date"], function(x) formatDate(x))
data[, "birth_date"]
#[1] "01/01/2001" "14/03/2010" "1982" ""