对具有书面功能的列子集使用lapply吗?

时间:2019-04-29 15:11:52

标签: r apply lapply as.date

我有一个数据集,其中某些列是字符形式的日期。 日期格式不一致,并且缺少数据。我编写了代码以将它们转换为正确的格式。 如果我对每列都使用lapply的代码,那么我没有问题。 当我尝试同时对多个列实现该功能时,代码给了我以下错误:Error in lout[w] <- *vtmp* : NAs are not allowed in subscripted assignments

guess_date <- function(x){
  require(lubridate)
  if (!is.na(x)){
    result <- as.character(parse_date_time(x, 
guess_formats(as.character(x), c("mdy", "dmy", "dmY")))[[1]])
  }
  else {result <- NA}
  return(result)
}

df <- data.frame(a = c("12/01/1988","10/17/1999"),b = 
c("12/01/1988",NA))
df$a <- unlist(lapply(df$a , guess_date))
df$a<- as.Date(df$a, format="%Y-%m-%d")

cols <- c("a","b")
df[,cols] <- lapply(df[,cols], function(x){
  require(lubridate)
  if (!is.na(x)){
    result <- as.character(parse_date_time(x, 
guess_formats(as.character(x), c("mdy", "dmy", "dmY")))[[1]])
  }
  else {result <- NA}
  return(result)
})

2 个答案:

答案 0 :(得分:2)

不确定我是否缺少某些内容,但看起来您有很多不必要的代码。效果很好

format

此外,as.Date中的所有日期似乎都遵循相同的df[] <- lapply(df, as.Date, "%m/%d/%Y") ,因此df <- data.frame(a = c("12/01/1988","10/17/1999"),b = ("12/01/1988",NA)) 也可以正常工作。

{{1}}

数据

{{1}}

答案 1 :(得分:0)

这里是anytime

的一个选项
library(dplyr)
library(anytime)
df %>% 
     mutate_all(anydate)
#          a          b
#1 1988-12-01 1988-12-01
#2 1999-10-17       <NA>

数据

df <- data.frame(a = c("12/01/1988","10/17/1999"),
          b = c("12/01/1988",NA))