我在一个函数中有这样的东西:
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"
}
但我得到了这个输出:
字符(0) if((as.numeric(出发) - as.numeric(到达))&lt; 0){:参数长度为零
时出错
我该如何解决这个问题,以便我的比较有效并打印正确的东西?
dataframe $ variable列的一些示例: 十六点33分00秒 15:34:00 14点51分○○秒 7时26分○○秒 5点48分00秒 11时十分00秒 17时48分零零秒 六点17分00秒 8时22分00秒 十一点31分00秒
答案 0 :(得分:1)
欢迎使用Stack Overflow!
首先,你获得一些投票的原因很可能是因为你没有在你的问题中给予太多的回报。首先,你没有告诉我们什么
(dataframe[z, ])$variable
是,这使我们很难制定完整的答案。您似乎试图从数据框中提取单个值,是吗?如果是这样,我从未见过这样做,尝试用以下内容替换上面的内容:
dataframe$variable[z]
我的猜测是你想要实现的是对数据框的整个列进行比较,称为“变量”,因为这通常更有用......
话虽如此,我经常遇到时间数据的问题,而且从我所听到的情况来看,我的经历并不少见。当我正在处理的时候,因为看起来你在这里,我更喜欢chron :: times格式而不是POSIXct(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"
)
这将输出一个向量“position”,其结果是从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做同样的事情,如果这是你感觉舒服的事情,我个人对你正在做的事情感到更加自在。