Использовать lapply для подмножества столбцов с письменной функцией? - PullRequest
1 голос
/ 29 апреля 2019

У меня есть набор данных, в котором определенные столбцы представляют собой даты в символьной форме.Даты несовместимы в их форматировании и отсутствуют данные.Я написал код для преобразования их в правильный формат.Если я использую код для каждого столбца с 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 ]

2 голосов
/ 29 апреля 2019

Не уверен, что я что-то упустил, но похоже, что у вас много ненужного кода.Это прекрасно работает

library(lubridate)
df[cols] <- lapply(df[cols], parse_date_time, c("mdy", "dmy", "dmY"))

df
#           a          b
#1 1988-12-01 1988-12-01
#2 1999-10-17       <NA>

Более того, все даты в df, кажется, следуют за тем же 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))
0 голосов
/ 29 апреля 2019

Вот вариант с 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))
...