Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R lapply、数据争用日期、意外输出_R_Function - Fatal编程技术网

R lapply、数据争用日期、意外输出

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

我有一个数据集(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

您可以尝试通过
将格式设置为.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这是我所期望的解决方案。但是上面的代码将所有日期更改为第一个出生日期值(格式正确)。这是我所期望的解决方案。但是上面的代码将所有日期更改为第一个出生日期值(格式正确)