R difftime&;普利尔

R difftime&;普利尔,r,datediff,R,Datediff,我有以下称为workfile的数据帧: 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

我有以下称为workfile的数据帧:

   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)) 
现在我有以下错误消息:

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

Error in attributes(out)简而言之,如果您转换时间表示,您的函数将工作:

# 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
#失败
ddply(pino,用户),变换,diff=c(difftime(tail(times,-1),head(times,-1)),NA))
#转换时间格式

pino$times您应该在对象上发布
dput
的结果,而不是发布控制台输出。默认情况下不会打印属性,因此我们不知道您在处理什么。如果没有数据,确实很难确定,但是为什么不试试:
diff=c(difftime(tail(times,-1),head(times,-1)),NA))
;请注意我是如何删除
工作文件$
部分的,我认为这将导致与转换冲突,因为您可能试图使用整个
时间
向量,而不是
ddply
的片段子集。我不能保证这是正确的,因为我还没有测试过它。是的,你可以,或者只将它的头部存储在一个新的对象中,如果它再现了问题,就将其作为整个数据进行dputframe@Llopis我把它放在上面。您已成功完成POSIXlt课程的学习。那真的把事情搞砸了。如果要在数据帧中使用日期时间,则需要使用POSIXct类。原因是POSIXlt对象实际上要复杂得多,一些函数,如
difftime
不接受POSIXlt对象。(为什么这对我来说似乎很奇怪,但事实就是这样。)“-”操作符确实执行时间减法,但
difftime
抛出一个错误。该错误类似于@IShouldBuyABoat&@nograps,我也注意到了两件事:1)如果
attach
my dataframe,那么它甚至可以与
POSIXlt
一起工作,我不知道为什么……此外,在附加它之前,我必须创建一个新的dataframe,其中的行是按累进顺序排列的……如果使用dataframe作为起始数据帧的子集,它就不起作用了。。。2) 如果我像您建议的那样使用
POSIXct
,则会发生另一个错误,因为我的数据帧非常大…:
data.frame中的错误(list(times=c(138956761613895676471389567678,:参数意味着不同的行数:34060152174
。我也不知道为什么。首先,不要使用
attach
,它只会导致更多的问题。其次,
as.POSIXct
真的只在较小的
数据上正常工作吗。frame
?它真的应该适用于任何大小的数据
data.frame
。我同意最好不要使用
attach
。如何在某些时间(
times=c(138956761613895676471389567678)修复这个事实
表示不同的行数:
34060、152174
?这意味着对于不同的用户,某些时间是相同的,因此
difftime
可能会变得疯狂?与
长度(pino$times)
相比,
长度(as.POSIXct(pino$times))是多少?
您确定键入的是
pino$times吗
# 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