【问题标题】:Problems with difftime &plyrdifftime &plyr 的问题
【发布时间】:2014-03-25 09:43:46
【问题描述】:

我有以下称为工作文件的数据框:

   head(workfile)  
                 times        users     signal log  
    14 2014-01-13 00:00:16 00250902DC7D   true  ON  
    28 2014-01-13 00:00:47 00250902DC7D   true  ON  
    42 2014-01-13 00:01:18 00250902DC7D   true  ON  
    56 2014-01-13 00:01:48 00250902DC7D   true  ON  
    70 2014-01-13 00:02:19 00250902DC7D   true  ON  
    84 2014-01-13 00:02:50 00250902DC7D   true  ON 

我有 14 个不同的用户,基本上我想计算每个用户的时间差。我正在使用 ddply 但它不起作用,我不明白原因

hope<-ddply(workfile,.
.(users),transform,diff=c(difftime(tail(workfile$times,-1),head(workfile$times,-1)), NA)) 

这里是错误消息:
*属性错误(out)*'

此外,如果我附加我的数据框并启动相同的命令,则会发生错误消息更改:
attach(workfile)

hope&lt;-ddply(workfile, .(users), transform, diff = c(difftime(tail(times, -1),head(times,-1)), NA))

*as.POSIXct.POSIXlt(time1) 中的错误:'x' 参数无效*
而且也很奇怪……

我注意到,就用户(在第 3 列中)而言,没有任何错误。如果我尝试使用具有不同用户的数据框,则会发生这种情况...显然我的代码在tail(...),head(...) 部分不正确我的目标是逐行计算所有用户的时间差...

我已将dput 与我的数据框样本一起使用:

head(pino)  
> pino
                     times        users signal log  
319001 2014-01-16 21:57:46 00250902FA92   true  ON  
319006 2014-01-16 21:57:46 002509030E53   true  ON  
319007 2014-01-16 21:57:46 002509030C41   true  ON  
319011 2014-01-16 21:57:46 00250902DC7D   true  ON  
319014 2014-01-16 21:57:49 00250902FB05   true  ON  
319015 2014-01-16 21:57:49 00250902FA92   true  ON  
319020 2014-01-16 21:57:49 002509030E53   true  ON  
319021 2014-01-16 21:57:49 002509030C41   true  ON  
319025 2014-01-16 21:57:49 00250902DC7D   true  ON  
319028 2014-01-16 21:57:58 00250902FB05   true  ON  
319029 2014-01-16 21:57:58 00250902FA92   true  ON  
319034 2014-01-16 21:57:58 002509030E53   true  ON  
319035 2014-01-16 21:57:58 002509030C41   true  ON  
319039 2014-01-16 21:57:58 00250902DC7D   true  ON  
319042 2014-01-16 21:58:04 00250902FB05   true  ON  
319043 2014-01-16 21:58:04 00250902FA92   true  ON

> dput(pino)
 structure(list(times = structure(list(sec = c(46, 46, 46, 46, 
 49, 49, 49, 49, 49, 58, 58, 58, 58, 58, 4, 4), min = c(57L, 57L, 
 57L, 57L, 57L, 57L, 57L, 57L, 57L, 57L, 57L, 57L, 57L, 57L, 58L, 
 58L), hour = c(21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 
 21L, 21L, 21L, 21L, 21L, 21L), mday = c(16L, 16L, 16L, 16L, 16L, 
 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L), mon = c(0L, 
 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
 year = c(114L, 114L, 114L, 114L, 114L, 114L, 114L, 114L, 
 114L, 114L, 114L, 114L, 114L, 114L, 114L, 114L), wday = c(4L, 
 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L
 ), yday = c(15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 
 15L, 15L, 15L, 15L, 15L, 15L, 15L), isdst = c(0L, 0L, 0L, 
 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("sec", 
 "min", "hour", "mday", "mon", "year", "wday", "yday", "isdst"
 ), class = c("POSIXlt", "POSIXt")), users = structure(c(3L, 13L, 
 10L, 1L, 4L, 3L, 13L, 10L, 1L, 4L, 3L, 13L, 10L, 1L, 4L, 3L), .Label = c("00250902DC7D",
 "00250902FA91", "00250902FA92", "00250902FB05", "00250902FB2E", 
 "00250902FE0A", "00250902FE63", "002509030AD2", "002509030B9D", 
 "002509030C41", "002509030C8D", "002509030CE4", "002509030E53", 
 "002509030E63"), class = "factor"), signal = structure(c(2L, 
 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("false", 
 "true"), class = "factor"), log = structure(c(2L, 2L, 2L, 2L, 
 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("OFF", 
 "ON"), class = "factor")), .Names = c("times", "users", "signal", 
 "log"), row.names = c(319001L, 319006L, 319007L, 319011L, 319014L, 
 319015L, 319020L, 319021L, 319025L, 319028L, 319029L, 319034L, 
 319035L, 319039L, 319042L, 319043L), class = "data.frame")

现在我收到以下错误消息:

Error in attributes(out) <- attributes(col) : 
  'names' attribute [9] must be the same length as the vector [3]

你怎么看?

【问题讨论】:

  • 您应该在您的对象上发布dput 的结果,而不是发布控制台输出。默认情况下不打印属性,因此我们并不真正知道您在处理什么。
  • 没有数据真的很难确定,但你为什么不试试:diff=c(difftime(tail(times,-1),head(times,-1)), NA));请注意我是如何删除workfile$ 部分的,我认为这会导致与变换发生冲突,因为您可能会尝试使用整个times 向量而不是ddply 的片段子集。我不能保证这是正确的,因为我还没有测试过。
  • 是的,你可以,或者只将它的头部存储在一个新对象中,如果它重现问题,则将其作为整个数据框存储
  • @Llopis 我把它放在上面了。
  • 啊。你已经成功地完成了 POSIXlt 课程。这真的把事情搞砸了。如果您要在数据框中使用日期时间,那么您需要使用 POSIXct 类。原因是 POSIXlt 对象实际上要复杂得多,并且某些函数(例如 difftime)不接受 POSIXlt 对象。 (为什么这对我来说似乎很奇怪,但事实就是如此。)“-”运算符确实会减去时间,但 difftime 会引发错误。

标签: r datediff


【解决方案1】:

简而言之,如果你转换你的时间表示,你的函数就会起作用:

# Fails
ddply(pino, .(users), transform, diff = c(difftime(tail(times, -1),head(times,-1)), NA))
# Convert time format
pino$times<-as.POSIXct(pino$times)  
# Works as expected
ddply(pino, .(users), transform, diff = c(difftime(tail(times, -1),head(times,-1)), NA))

#                  times        users signal log diff
# 1  2014-01-16 21:57:46 00250902DC7D   true  ON    3
# 2  2014-01-16 21:57:49 00250902DC7D   true  ON    9
# 3  2014-01-16 21:57:58 00250902DC7D   true  ON   NA
# 4  2014-01-16 21:57:46 00250902FA92   true  ON    3
# 5  2014-01-16 21:57:49 00250902FA92   true  ON    9
# 6  2014-01-16 21:57:58 00250902FA92   true  ON    6
# 7  2014-01-16 21:58:04 00250902FA92   true  ON   NA
# 8  2014-01-16 21:57:49 00250902FB05   true  ON    9
# 9  2014-01-16 21:57:58 00250902FB05   true  ON    6
# 10 2014-01-16 21:58:04 00250902FB05   true  ON   NA
# 11 2014-01-16 21:57:46 002509030C41   true  ON    3
# 12 2014-01-16 21:57:49 002509030C41   true  ON    9
# 13 2014-01-16 21:57:58 002509030C41   true  ON   NA
# 14 2014-01-16 21:57:46 002509030E53   true  ON    3
# 15 2014-01-16 21:57:49 002509030E53   true  ON    9
# 16 2014-01-16 21:57:58 002509030E53   true  ON   NA

我不太清楚为什么会这样。这是mentioned before in another question,@hadley 刚刚声明您应该在data.frame 中使用POSIXct 而不是POSIXlt。我不清楚为什么。

【讨论】:

  • 该错误似乎类似于this question
  • @IShouldBuyABoat & @nograpes,我也注意到了两件事:1)如果attach我的数据框那么它甚至可以使用POSIXlt,我不知道为什么......在在附加之前添加它我必须创建一个新的数据框,其中行按渐进顺序排列...如果将数据框用作起始数据框的子集,它不起作用... 2)如果我同时使用POSIXctlike您建议发生另一个错误,因为我的数据框很大......:Error in data.frame(list(times = c(1389567616, 1389567647, 1389567678,:arguments imply differing number of rows: 34060, 152174。我也不知道为什么..
  • 首先,不要使用attach,只会导致更多问题。其次,as.POSIXct 真的只能在较小的data.frame 上正常工作吗?它确实适用于data.frame 的任何大小。
  • 我同意最好不要使用attach。我怎样才能修复这个事实(times = c(1389567616, 1389567647, 1389567678) 暗示不同的行数:34060, 152174?这意味着有些时候是对于不同的用户来说都是一样的,因此difftime 可能会发疯?
  • length(pino$times) 相比,length(as.POSIXct(pino$times)) 是什么?你确定你输入的是pino$times&lt;-as.POSIXct(pino$times)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多