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