2013-08-12 2 views
12

Это псевдо продолжение к этому вопросу: Why is ggplot graphing null percentage data points?Есть ли способ проверить, является ли столбец Date in R?

Допустим, это мой набор данных:

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, форматирование столбца в формате «Date», а затем сохраните файл как CSV. Какой тип это в R? Я ищу выражение, подобное приведенному выше, которое возвращает TRUE.

+1

Do 'ул (data_set) 'и добавьте его в свой вопрос. –

+0

'inherits (data [[1]]," Date ")' – baptiste

+0

@Bryan Хорошая идея, я вижу, что 'Date' является фактором, а is.numeric (data [[1]]) возвращает TRUE. Но если у меня было несколько факторов в таблице, есть ли способ отличить Date? – jeffrey

ответ

12

Вы можете попытаться принудить все столбцы к 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 
+0

Это самая точная вещь, с которой я столкнулся. Можете ли вы объяснить, как вы это сделали? Кажется, я не могу найти какую-либо информацию о '! All' и is.na.na. – jeffrey

+0

Что касается 'is.na' и' all', попробуйте посмотреть на это: '? Is.na; x <- c (1,2,3, NA, 5); is.na (х); ?все; y <- c (1,2,3,4,5); все (y> 0); ! все (y> 0); ! all (y> 3); ' –

11

Использование 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 
+0

Предполагается, что вы уже определили, какие столбцы уже есть Даты, и правильно их преобразовали. Он возвращает 'FALSE' для всех 3 столбцов моего набора тестовых данных. – thelatemail

2

Для работы с датами я использую функцию, чтобы определить, являются ли строки датами, а если они есть, преобразуйте их в предопределенный формат (в этом случае я выберите '' % d /% м /% 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 

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

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

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

0

функции, что я создан на основе ответов здесь, и использую сейчас

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) 
    } 
} 
Смежные вопросы