将函数应用于 R 数据帧中的时间序列

applying a function to a timeseries in a R dataframe

我正在尝试将函数应用于包含日期的数据框中的列,但一直出现错误。我不确定自己做错了什么。

我的数据框:

                 dates total
 1 2014-12-08 01:10:00 163.7
 2 2014-12-08 01:10:00 163.9
 3 2014-12-08 01:12:00 163.6
 4 2014-12-08 08:27:00 163.0
 5 2014-12-08 08:35:00 163.7
 6 2014-12-08 08:39:00 162.4

我想用 'morning' 或 'night' 替换日期,或者用 'morning' 或 'night' 创建一个新列。我采取的方法涉及取消日期的分类,这样我就可以得到时间。我将一个晚上定义为凌晨 4 点之前或下午 5 点之后。我把它放在一个叫做 timeofday 的函数中:

timeofday <- function(x) {
  bmk <- unclass(x)
  if (bmk$hour < 4) {
    return("night")
  } else if (bmk$hour > 17) {
    return("night")
  } else {
    return("morning")
 }
}

然后我做了以下事情:

timeofday(df$dates)

Warning message:
In if (bmk$hour < 4) { :
   the condition has length > 1 and only the first element will be used

如果您能帮助我们确定问题,我们将不胜感激。

您的代码包含此 if 语句

 if (bmk$hour < 4)

如果 bmk 是一个向量,就像您的情况一样,您有一个包含向量的 if 语句,因此它将只考虑向量的第一个元素。

这是解决方法

sapply(df$dates, timeofday)

您也可以使用 cut,如:

cut(unclass(x)$hour-7,c(0,15,24)-8,c('night','morning'))

(注意你必须改变你的参照系,这样你就没有两个 'night' 类别与这个解决方案)