31

这是这个问题的伪后续:为什么 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() 将数据输入的“日期”列转换为实际日期,假设我不知道数据集的列名)。

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

我在 Excel 中创建了“日期”列,将列格式化为“日期”格式,然后将文件保存为 csv。这是R中的什么类型?我寻求一个类似于上述返回 TRUE 的表达式。

4

8 回答 8

33

用于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
于 2016-05-06T01:47:10.240 回答
19

您可以尝试强制所有列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 
于 2013-08-12T01:52:21.627 回答
13

我知道这个问题很老了,但我确实想提一下,lubridateis.Date中现在有一个函数is.POSIXt

sapply(list(as.Date('2000-01-01'), 123, 'ABC'), is.Date)
[1]  TRUE FALSE FALSE
于 2018-07-19T13:26:56.273 回答
5

OP 明确要求检查:

我需要一些东西来告诉“日期”列是日期类型

那么 R 附带了多少个日期类?正好两个:DatePOSIXt不包括它们的衍生物POSIXctPOSIXlt)。

所以我们可以检查一下,让它比已经给出的答案更健壮:

is.Date <- function(x) {
  inherits(x, c("Date", "POSIXt"))
}

尽可能强大。

is.Date(as.Date("2020-02-02"))
#> [1] TRUE
is.Date(as.POSIXct("2020-02-02"))
#> [1] TRUE
is.Date(as.POSIXlt("2020-02-02"))
#> [1] TRUE

如果您想知道列是否可以成功转换/强制转换为 Date 类型,那么这是另一个问题。这是按照要求:'告诉 [...] 是 Date 类型'。

于 2020-02-28T08:33:37.727 回答
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

您可以确定所有元素是否都是日期。

此功能的优点是您可以根据正在使用的数据添加更多模式和日期格式,并以标准格式结束所有这些日期。(缺点是这不是问题所要问的)

我希望这有帮助

于 2016-08-09T14:08:19.850 回答
2

我根据此处的答案创建并立即使用的功能

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)
  }
}
于 2017-08-29T08:25:50.213 回答
1

我将参考一个简单的例子,我希望它可以概括。说你有约会

d1<-Sys.Date()
d1

“2020-02-12”

deparse(d1)

“结构(18304,类=\”日期\“)”

因此

grep("Date",deparse(d1))>=1

真的

或者使用

class(d1)

“日期”

于 2020-02-12T15:34:19.103 回答
-1

这是我的做法。大部分时间都可以工作,但需要改进

MissLt <- function(x, ratio = 0.5){
  sum(is.na(x))/length(x) < ratio
}


IS.Date  <- function(x, addformat = NULL, exactformat = NULL){
  if (is.null(exactformat)){
    format = c("%m/%d/%Y", "%m-%d-%Y","%Y/%m/%d" ,"%Y-%m-%d", addformat) 
    y <- as.Date(as.character(x),format= format)
    MissLt(y,ratio = 1-(1/length(y)))}
  else{
    y <- as.Date(as.character(x),format= exactformat)
    MissLt(y,ratio = 1-(1/length(y)))}
}
sapply(data, IS.Date)
于 2019-11-19T16:07:40.337 回答