根据某些条件找到持续时间

时间:2019-08-27 13:44:56

标签: r dataframe

我有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

2 个答案:

答案 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 v1filter分组,这样我们只有感兴趣的分组。仅取distinct的{​​{1}}值,并创建2行的组,这些行代表开始时间和结束时间彼此相减。我们使用v1来获取宽格式的数据。

spread