lapply,数据争执日期,意外输出

时间:2018-07-24 05:00:12

标签: 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 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;
}

2 个答案:

答案 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"       ""