【问题标题】:Issues with if / ifelseif / ifelse 的问题
【发布时间】:2015-06-02 14:05:27
【问题描述】:

我有一个包含非结构化日期信息字段的数据集。我正在尝试将其转换为日期,但是该字段有 2 种日期形​​式,一种是上午 / 下午,另一种是 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) > 17, strptime(fb2$Date, "%m/%d/%Y %I:%M %p"), : 项目数 replace 不是替换长度 2 的倍数:在 ifelse(nchar(fb2$Date) > 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

【问题讨论】:

  • 你能提供一些示例数据吗?此外,在您的ifelse 语句中,第一个strptime 具有/%d#,第二个具有/%d。你是故意的吗?
  • sapply(original_vector, dateCheck) 应该可以工作,但ifelse 也应该可以。正如约翰所说,我们需要数据。
  • 样本数据为:一种类型为“04/14/2015 10:28 am”,另一种类型为“04/11/2015 11:28:00”

标签: r


【解决方案1】:
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")

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

【讨论】:

  • 非常感谢!!那工作得很好。为帮助干杯 - 应该考虑一下解决方法,但仍然想知道为什么我的 ifelse 不起作用。如果可以但没有足够的代表会投票!
猜你喜欢
  • 2019-12-11
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多