Есть ли способ проверить, является ли столбец Date in R?

Это псевдоопределение по этому вопросу: Почему графическое отображение ggplot нулевые процентные точки данных?

Скажем, это мой набор данных:

Date        AE      AA      AEF     Percent
1/1/2012    1211    1000    3556    0.03
1/2/2012    100     2000    3221    0.43
1/3/2012    3423    10000   2343    0.54
1/4/2012    10000   3000    332     0.43
1/5/2012    2342    500     4435    0.43
1/6/2012    2342    800     2342    0.23
1/7/2012    2342    1500    1231    0.12
1/8/2012    111     2300    333 
1/9/2012    1231    1313    3433    
1/10/2012   3453    5654    222 
1/11/2012   3453    3453    454 
1/12/2012   5654    7685    3452 

> str(data)
'data.frame':   12 obs. of  5 variables:
 $ Date   : Factor w/ 12 levels "10/11/2012","10/12/2012",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ AE     : int  1211 100 3423 10000 2342 2342 2342 111 1231 3453 ...
 $ AA     : int  1000 2000 10000 3000 500 800 1500 2300 1313 5654 ...
 $ AEF    : int  3556 3221 2343 332 4435 2342 1231 333 3433 222 ...
 $ Percent: num  0.03 0.43 0.54 0.43 0.43 0.23 0.12 NA NA NA ...

Мне нужно что-то сказать, что столбец "Дата" является типом даты, а не числовым или символьным (это потому, что мне нужно преобразовать столбец "Дата" ввода данных в фактическую дату с as. Date(), ASSSUMING, что я не знаю имена столбцов набора данных).

is.numeric(data[[1]]) returns False
is.character(data[[1]]) returns False

Я сделал столбец "Дата" в Excel, форматируя столбец в формате "Дата", а затем сохранил файл как csv. Какой тип это в R? Я ищу выражение, подобное приведенному выше, которое возвращает TRUE.

Ответ 1

Вы можете попытаться принудить все столбцы к as.Date и посмотреть, какие из них успешны. Вам нужно будет указать формат, в котором вы ожидаете даты. Например:.

data <- data.frame(
  Date=c("10/11/2012","10/12/2012"),
  AE=c(1211,100),
  Percent=c(0.03,0.43)
)

sapply(data, function(x) !all(is.na(as.Date(as.character(x),format="%d/%m/%Y"))))
#Date      AE Percent 
#TRUE   FALSE   FALSE 

Ответ 2

Используйте inherits, чтобы определить, имеет ли аргумент тип данных Date:

is.date <- function(x) inherits(x, 'Date')

sapply(list(as.Date('2000-01-01'), 123, 'ABC'), is.date)
#[1]  TRUE FALSE FALSE

Если вы хотите проверить, может ли аргумент символа быть преобразован в Date, то используйте это:

is.convertible.to.date <- function(x) !is.na(as.Date(as.character(x), tz = 'UTC', format = '%Y-%m-%d'))

sapply(list('2000-01-01', 123, 'ABC'), is.convertible.to.date)
# [1]  TRUE FALSE FALSE

Ответ 3

Для работы с датами я использую функцию для определения, являются ли строки датами, и если они есть, преобразуйте их в предопределенный формат (в этом случае я выбираю "% d/% m/% Y" ):

standarDates <- function(string) {
  patterns = c('[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]','[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]','[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]')
  formatdates = c('%Y/%m/%d','%d/%m/%Y','%Y-%m-%d')
  standardformat='%d/%m/%Y'
  for(i in 1:3){
    if(grepl(patterns[i], string)){
      aux=as.Date(string,format=formatdates[i])
      if(!is.na(aux)){
        return(format(aux, standardformat))
      }
    }
  }
  return(FALSE)
}

Предположим, что у вас есть вектор

a=c("2018-24-16","1587/03/16","fhjfmk","9885/04/16")

> sapply(a,standarDates)
2018-24-16   1587/03/16       fhjfmk   9885/04/16 
  "FALSE"   "16/03/1587"      "FALSE" "16/04/9885"

с помощью команды

"FALSE"%in%sapply(a,standarDates)
[1] True

вы можете выяснить, все ли элементы являются датами.

Преимущество этой функции заключается в том, что вы можете добавлять больше шаблонов и форматов дат в соответствии с данными, которые вы работаете, и заканчивать стандартным форматом также для всех этих дат. (Недостатком является то, что это не совсем то, что задает вопрос)

Я надеюсь, что это поможет

Ответ 4

Функция, которую я создал на основе ответов здесь, и теперь использую

is.Date <- function(date) {
  if (sapply(date, function(x)
     ! all(is.na(as.Date(
     as.character(x),
     format = c("%d/%m/%Y", "%d-%m-%Y", "%Y/%m/%d", "%Y-%m-%d")
     ))))) {
    return(TRUE)
  } else{
    return(FALSE)
  }
}