在阅读了很多关于此的文章并尝试了针对我的数据的解决方案之后,我仍然没有得到理想的结果。基本上,我有一个data.frame
带有两个时间列的:TimeStamp
和StartTime
一个用作事件标识符的列:ID
。我想创建第三列,如果使用ID == -999
(表示非事件)则使用了该TimeStamp
列,否则StartTime
应使用。
更复杂一点:数据代表事件的“块”。在事件之间,有时间什么都不发生,即ID == -999
。在那种情况下,我希望该列由该块的第一个元素填充。
这是我的数据的简化版:
ID <- rep(c(84,-999,88),c(3,3,4))
f <- as.POSIXct("09:55:45", format = "%H:%M:%S")
t <- as.POSIXct("10:05:45", format = "%H:%M:%S")
TimeStamp <- seq.POSIXt(from = f, to = t, length.out = 10)
StartTime <- as.POSIXct(rep(c("09:54:12",NA,"10:02:25"),c(3,3,4)), format = "%H:%M:%S")
df <- data.frame(TimeStamp,StartTime,ID)
这是我想要的结果:
> df[,"Time"] <- rep(c("09:54","09:59","10:02"), c(3,3,4))
> df
# TimeStamp StartTime ID Time
#1 2015-04-13 09:55:45 2015-04-13 09:54:12 84 09:54
#2 2015-04-13 09:56:51 2015-04-13 09:54:12 84 09:54
#3 2015-04-13 09:57:58 2015-04-13 09:54:12 84 09:54
#4 2015-04-13 09:59:05 <NA> -999 09:59
#5 2015-04-13 10:00:11 <NA> -999 09:59
#6 2015-04-13 10:01:18 <NA> -999 09:59
#7 2015-04-13 10:02:25 2015-04-13 10:02:25 88 10:02
#8 2015-04-13 10:03:31 2015-04-13 10:02:25 88 10:02
#9 2015-04-13 10:04:38 2015-04-13 10:02:25 88 10:02
#10 2015-04-13 10:05:45 2015-04-13 10:02:25 88 10:02
我已经尝试过类似ifelse
和的事情sapply
。它不是真的工作。到目前为止,我的解决方案是提取所有非事件(ID == -999
)。然后使用另一个ID变量来标识所有唯一事件/非事件,aggregate
以找到第一个TimeStamp
withmin
函数。然后,我有两个不同的Time
,我联接使用该解决方案列后。它可行,但是我认为有一种更优雅,更直接的方法可以做到这一点。但是作为R新手,我还不能解决。
有什么建议?
顺便说一句:我希望它有点清楚,如果不是,请告诉我。
编辑:我不认为我的问题是重复的,因为这些答案在我的情况下不起作用。它不能解决我在上面试图解释的增加的复杂性。
这是使用data.table
v> = 1.9.5的可能解决方案(我-999
在数据集的末尾添加了另一个事件,因为我了解您希望对它进行不同的处理)。
基本上,我只是使用新rleid
函数创建一个新索引(并将其直接插入到by
语句中),然后设置一个简单的if
else
语句
library(data.table)
setDT(df)[, Time := if(anyNA(StartTime)) {
format(TimeStamp[1L], "%H:%M")
} else {
format(StartTime[1L], "%H:%M")
},
by = rleid(ID)][]
# TimeStamp StartTime ID Time
# 1: 2015-04-13 09:55:45 2015-04-13 09:54:12 84 09:54
# 2: 2015-04-13 09:56:49 2015-04-13 09:54:12 84 09:54
# 3: 2015-04-13 09:57:54 2015-04-13 09:54:12 84 09:54
# 4: 2015-04-13 09:58:58 <NA> -999 09:58
# 5: 2015-04-13 10:00:03 <NA> -999 09:58
# 6: 2015-04-13 10:01:08 <NA> -999 09:58
# 7: 2015-04-13 10:02:12 2015-04-13 10:02:25 88 10:02
# 8: 2015-04-13 10:03:17 2015-04-13 10:02:25 88 10:02
# 9: 2015-04-13 10:04:21 2015-04-13 10:02:25 88 10:02
# 10: 2015-04-13 10:05:26 2015-04-13 10:02:25 88 10:02
# 11: 2015-04-13 10:06:31 <NA> -999 10:06
# 12: 2015-04-13 10:07:35 <NA> -999 10:06
# 13: 2015-04-13 10:08:40 <NA> -999 10:06
# 14: 2015-04-13 10:09:45 <NA> -999 10:06
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句