if / ifelse的问题

时间:2015-06-02 14:05:28

标签: r

我的数据集包含一个包含非结构化日期信息的字段。我正在尝试将其转换为日期,但该字段有两种日期形式,一种是上午/下午和一种24小时时钟。

如果我尝试将其直接转换,它会中断,显然会给出错误的答案。

在做了一些检查后,我开始使用一个简单的if函数。具有am / pm的字段之间的主要区别是字段的长度,所以我尝试了以下内容:

dateCheck <- function(x) {
if(nchar(x) > 17) {
strptime(x,"%m/%d/%Y %I:%M %p")
} else {
strptime(x,"%m/%d/%Y %H:%M")
}
}

这不起作用,并返回以下错误:

  

条件的长度> 1,只使用第一个元素

经过一些研究后,我发现使用if函数存在一些问题,我应该使用ifelse并提出以下内容:

ifelse(nchar(x) > 17,strptime(x,"%m/%d/%Y %I:%M %p"),strptime(x,"%m/%d/%Y %H:%M"))

这对我的数据框架非常混乱,并给了我一个绝对的垃圾读数。 它最近也开始给我以下错误:

  

警告信息:1:在ifelse(nchar(fb2 $ Date)&gt; 17中,   strptime(fb2 $ Date,“%m /%d /%Y%I:%M%p”),:项目数量   替换不是替换长度的倍数2:In   ifelse(nchar(fb2 $ Date)&gt; 17,strptime(fb2 $ Date,“%m /%d /%Y%I:%M%p”),   :要替换的项目数不是替换长度的倍数

知道我应该做什么吗?

编辑:使用样本数据

The type with the AM / PM
04/20/2015 3:47 pm
04/20/2015 3:32 pm
04/19/2015 12:45 pm
04/18/2015 9:00 pm
04/16/2015 2:52 pm
04/14/2015 4:40 pm
04/14/2015 10:48 am
04/14/2015 10:28 am

The type without
04/11/2015 11:28
04/10/2015 16:12
04/09/2015 16:44
04/08/2015 12:12
04/08/2015 11:38
04/07/2015 12:11
04/05/2015 08:45

这意味着数据的示例一起显示为

04/16/2015 2:52 pm
04/14/2015 4:40 pm
04/14/2015 10:48 am
04/14/2015 10:28 am
04/11/2015 11:28
04/10/2015 16:12
04/09/2015 16:44
04/03/2015 08:57
04/02/2015 17:41
04/01/2015 11:44
03/28/2015 12:45 pm
03/28/2015 10:59 am
03/27/2015 4:13 pm
03/23/2015 5:02 pm
03/22/2015 4:06 pm
03/22/2015 1:10 pm
03/21/2015 8:20 am
03/19/2015 10:12 am
03/18/2015 1:41 pm
03/17/2015 1:41 pm
03/13/2015 4:03 pm
03/12/2015 15:19
03/12/2015 11:05
03/11/2015 16:12
03/11/2015 09:46
03/08/2015 19:29

1 个答案:

答案 0 :(得分:0)

raw.vector <- c("04/16/2015 2:52 pm", "04/14/2015 4:40 pm", "04/14/2015 10:48 am"
                     , "04/11/2015 11:28", "04/10/2015 16:12")

mod.vector <- strptime(raw.vector,"%m/%d/%Y %I:%M %p")
ind <- is.na(mod.vector)
mod.vector[ind] <- strptime(raw.vector[ind],"%m/%d/%Y %H:%M")

它应该在没有警告的情况下工作。 但是不知道警告产品是什么。