R lapply、数据争用日期、意外输出
我有一个数据集(CSV),其中一列包含多种日期格式,可以R lapply、数据争用日期、意外输出,r,function,R,Function,我有一个数据集(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
|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
您可以尝试通过
将格式设置为.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
data您可以尝试通过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
数据strsplit的输出是一个列表
。我们可以矢量化而不是循环遍历每个元素,但是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" ""
formatDatestrsplit
的输出是一个列表
。我们可以矢量化而不是循环遍历每个元素,但是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" ""
formatDate这是我所期望的解决方案。但是上面的代码将所有日期更改为第一个出生日期值(格式正确)。这是我所期望的解决方案。但是上面的代码将所有日期更改为第一个出生日期值(格式正确)