2016-06-10 105 views
-3

我有这样的事情在一个函数中:试图比较POSIXct对象中的if语句

x <- as.POSIXct((substr((dataframe[z, ])$variable, 1, 8)), tz = "GMT", 
format = "%H:%M:%S") 
print(x) 
if ((x >= as.POSIXct("06:00:00", tz = "GMT", format = "%H:%M:%S")) & 
(x < as.POSIXct("12:00:00", tz = "GMT", format = "%H:%M:%S"))){ 
position <- "first" 
} 

,但我得到这样的输出:

character(0) Error in if ((as.numeric(departure) - as.numeric(arrival)) < 0) { : argument is of length zero

我怎么能解决这个问题,所以我比较的作品和它打印正确的东西?

数据框$变量列的一些例子: 16点33分00秒 15:34:00 十四时51分00秒 七时26分00秒 5时48分00秒 11时10分00秒 17:48:00 06:17:00 08:22:00 11:31:00

+0

如果有人知道我可以在if语句中比较as.POSIXct对象,我将非常感激。 –

+0

我可以假设您已将问题缩小到您向我们展示的代码部分了吗?否则你的错误说,所以我希望你已经裁定“出发 - 到达”部分? – rosscova

+1

因为你的值已经是正确的格式,你打电话给substr的任何原因? – rosscova

回答

1

欢迎来到Stack Overflow!

首先,你得到一些反对票的原因很可能是因为你没有给你太多的问题继续下去。首先,你没有告诉我们什么

(dataframe[z, ])$variable 

是,这使我们很难制定一个完整的答案。您似乎试图从数据框中提取单个值,是吗?如果是这样,我从来没有见过它这样做的方式,尝试更换上面:

dataframe$variable[z] 

我的猜测是你想达到什么样的数据帧的一整列的所谓的“变量”的比较,因为这通常更有用...

话虽如此,我经常反对与时间数据的问题,从我听到的,我的经验并不少见。当我正在处理的时候,因为看起来你在这里,我更喜欢在POSIXct上使用chron :: times格式(POSIX是日期时间格式,所以总是包含日期,它也会尝试更正时区更改,以及夏令时的变化,这些变化往往会影响我的方式而不是帮助)。如果您的数据采用了您在第一次as.POSIXct调用中指定的格式,那么您甚至不需要指定调用times函数。

x <- chron::times(dataframe$variable) 
print(x) 
position <- ifelse (x >= chron::times("06:00:00") & 
        x < chron::times("12:00:00"), 
       "first", "not first" 
) 

这将输出一个矢量“位置”,其结果是从dataframe $ variable中获取的所有值。这是否达到了你的期望?

从这里,如果你是想提取的比较结果在数据帧的特定行“Z”,你仍然可以做到这一点与

position[z] 

编辑补充: 这可能是值得检查缺少“变量”中的值。这应该返回TRUE:

sum(is.na(dataframe$variable)) == 0 

还检查任何格式不正确。同样,这应该返回TRUE:

sum(is.na(chron::times(dataframe$variable))) == 0 

编辑补充: 按照意见,它看起来像某些值在“变量”列不正确转换。你应该可以找到它们

subset(dataframe, is.na(chron::times(variable))) 

这应该让你看看有什么不对。它可能是一个单元,也可能是其中的一部分。你需要整理这些数据,你可以用几种方法来完成。您可以手动完成并修复它们,您可以在脚本中添加一个函数以在转换之前修复它们(如果所有这些值之间存在共同的问题,或者您希望遇到同样的问题,这可能是个好主意当新数据进入时再次发生,如果确实需要允许的话)。

另一种选择是简单地从分析中排除这些行。如果你走这条路线,确保它适合你正在运行的分析。如果你的情况适合,您可以添加步运行在你的问题的步骤之前进行清理数据框:

dataframe <- subset(dataframe, !is.na(chron::times(variable))) 

注意:有一个很好的机会,这将拿出一个警告。如果两次运行同一行,并且第二次警告消失(在违规行被删除后),则可能需要进一步研究。

这应该放弃违规值,只保留正确转换为时间格式的值,这应该有助于您尝试运行的步骤。检查您的数据框维度在该步骤之前和之后的变化情况;那会告诉你你有多少行正在丢失。

你可以用POSIXct做同样的事情,如果这就是你感觉舒服的话,我个人更喜欢你正在做的事。

+0

我尝试使用chron :: times,正如你所建议的那样,但是当我打印x在我的函数中我仍然得到不正确的东西(时间(0)),并且我使用POSIXct得到了字符(0)。你知道为什么会发生这种情况吗?当我将它复制到我的所有打印和比较中时,控制台,但是当我运行页面没有任何作用 –

+0

这听起来像是你的代码中的其他地方出现错误,或者更可能是数据中某处格式不匹配,再次,没有一个完整的图片很难给出一个好的答案。 – rosscova

+0

dataframe $变量的外观如何? – rosscova