这是对此问题的伪跟进:Why is ggplot graphing null percentage data points?
假设这是我的数据集:
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 ...
我需要告诉我们'Date'列是Date类型而不是数字或字符类型(这是因为我必须将数据输入的'Date'列转换为as的实际Date。 Date(),ASSSUMING,我不知道数据集的列名。)
is.numeric(data[[1]]) returns False
is.character(data[[1]]) returns False
我在Excel中创建了“日期”列,以“日期”格式格式化列,然后将文件另存为csv。这是什么类型的R?我寻找一个类似于上面的表达式,返回TRUE。
答案 0 :(得分:18)
使用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
答案 1 :(得分:12)
您可以尝试将所有列强制转换为as.Date
,并查看哪些列成功。您需要指定您希望日期的格式。 E.g:
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 :(得分:4)
我知道这个问题很旧,但是我确实想提一下,lubridate
包中现在有一个函数可以用于is.Date
和is.POSIXt
sapply(list(as.Date('2000-01-01'), 123, 'ABC'), is.Date)
[1] TRUE FALSE FALSE
答案 3 :(得分:2)
要使用日期我使用函数来识别字符串是否为日期,如果是,则将它们转换为预定义格式(在这种情况下,我选择&#39;%d /%m / %Y&#39):
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 :(得分:1)
我将参考一个简单的示例,希望可以将其概括化。 假设您有个约会
d1<-Sys.Date()
d1
“ 2020-02-12”
deparse(d1)
“ structure(18304,class = \” Date \“)”
因此
grep("Date",deparse(d1))>=1
是
替代使用
class(d1)
“日期”
答案 5 :(得分:1)
OP显然只要求检查:
我需要说明“日期”列为日期类型
R附带多少个日期类?正好两个:Date
和POSIXt
(排除其派生词,例如POSIXct
和POSIXlt
)。
因此我们可以进行检查,使其比已经给出的答案更可靠:
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类型,那么这是另一个问题。这是针对以下要求:“告诉[...]是日期类型”。
答案 6 :(得分: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)
}
}
答案 7 :(得分:0)
这是我的方法。大部分时间都有效,但需要改进
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)