我有4个变量x,y,z,a,它们将同时记录在我的数据库中。我需要找到x or y or z !=0 and a>8
的持续时间。它将来自01-01-2019 01:04:32 to 01-01-2019 01:06:13
。
我试图获得满足以上条件的所有事件和持续时间。这就像是一个间隙和孤岛的问题。
输出类似:01-01-2019 01:04:32 to 01-01-2019 01:06:13 for 00:01:41
。如果有更多数据,我还会尝试按天或按周显示。
v1 v2 v3
01-01-2019 01:03:56 x 1
01-01-2019 01:03:56 y 2
01-01-2019 01:03:56 z 3
01-01-2019 01:03:56 a 4.5
01-01-2019 01:04:32 x 3
01-01-2019 01:04:32 y 2.1
01-01-2019 01:04:32 z 6
01-01-2019 01:04:32 a 8
01-01-2019 01:06:13 x 9
01-01-2019 01:06:13 y 3
01-01-2019 01:06:13 z 2
01-01-2019 01:06:13 a 9.56
答案 0 :(得分:0)
下面的代码标识何时满足您的条件。您如何得到的结果是“ 01-01-2019 01:04:32 01-01-2019 01:06:13 00:01:41”?您的样本数据框可能会指出,否则01:03:56也符合您在x,y和z上的标准。
# Flag when conditions are met
df$s <- ifelse( (df$v2 == 'x' & df$v3 != 0 ) | (df$v2 == 'y' & df$v3 != 0 ) | (df$v2 == 'z' & df$v3 != 0 ) | (df$v2 == 'a' & df$v3 > 8) , 1, 0)
View(df)
使用此数据
# Create sample data frame
df <- data.frame(
v1 = c(
as.POSIXct("2019-01-01 01:03:56"),
as.POSIXct("2019-01-01 01:03:56"),
as.POSIXct("2019-01-01 01:03:56"),
as.POSIXct("2019-01-01 01:03:56"),
as.POSIXct("2019-01-01 01:04:32"),
as.POSIXct("2019-01-01 01:04:32"),
as.POSIXct("2019-01-01 01:04:32"),
as.POSIXct("2019-01-01 01:04:32"),
as.POSIXct("2019-01-01 01:06:13"),
as.POSIXct("2019-01-01 01:06:13"),
as.POSIXct("2019-01-01 01:06:13"),
as.POSIXct("2019-01-01 01:06:13")),
v2 = c('x','y','z','a','x','y','z','a','x','y','z','a'),
v3 = c(1,2,3,4.5,3,2.1,6,8,9,3,2,9.56)
)
答案 1 :(得分:0)
使用dplyr
,我们可以根据提到的标准group_by
v1
和filter
分组,这样我们只有感兴趣的分组。仅取distinct
的{{1}}值,并创建2行的组,这些行代表开始时间和结束时间彼此相减。我们使用v1
来获取宽格式的数据。
spread