查找连续值序列中的最后一行

时间:2014-07-14 20:43:33

标签: r aggregate data.table

我正在处理一系列TRUE和FALSE序列,这些序列按组进行组织并在一段时间内延伸(例如几天)。下面,我花时间重新创建了一个示例,并使用data.frame包将data.table转换为data.table

> dput(df)
structure(list(day = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L), group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor"), 
    condition = structure(c(1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 
    2L, 1L, 1L, 2L, 2L), .Label = c("FALSE", "TRUE"), class = "factor")), .Names = c("day", 
"group", "condition"), row.names = c(NA, -14L), class = "data.frame")
> library(data.table)
> df <- as.data.table(df)
> setkey(df, group)
> df
    day group condition
 1:   1     a     FALSE
 2:   2     a     FALSE
 3:   3     a      TRUE
 4:   4     a      TRUE
 5:   5     a      TRUE
 6:   6     a     FALSE
 7:   7     a     FALSE
 8:   1     b     FALSE
 9:   2     b      TRUE
10:   3     b      TRUE
11:   4     b     FALSE
12:   5     b     FALSE
13:   6     b      TRUE
14:   7     b      TRUE

使用data.table,我知道如何为条件等于“TRUE”的每个组选择第一天:

> df[condition == "TRUE", day[1], by = group]
   group V1
1:     a  3
2:     b  2
> df
    day group condition
 1:   1     a     FALSE
 2:   2     a     FALSE
 3:   3     a      TRUE     <~~~~~~~~
 4:   4     a      TRUE
 5:   5     a      TRUE
 6:   6     a     FALSE
 7:   7     a     FALSE
 8:   1     b     FALSE
 9:   2     b      TRUE     <~~~~~~~~
10:   3     b      TRUE
11:   4     b     FALSE
12:   5     b     FALSE
13:   6     b      TRUE
14:   7     b      TRUE

我想要完成的是一个最终输出,它标识条件等于“TRUE”的每个组的第一个序列的最后一行。请参阅下面的输出:

       group V1
    1:     a  5
    2:     b  3
> df
    day group condition
 1:   1     a     FALSE
 2:   2     a     FALSE
 3:   3     a      TRUE
 4:   4     a      TRUE
 5:   5     a      TRUE     <~~~~~
 6:   6     a     FALSE
 7:   7     a     FALSE
 8:   1     b     FALSE
 9:   2     b      TRUE
10:   3     b      TRUE     <~~~~~
11:   4     b     FALSE
12:   5     b     FALSE
13:   6     b      TRUE
14:   7     b      TRUE

任何建议,建议或其他材料将不胜感激。感谢您的时间,并随时提出任何澄清问题!

1 个答案:

答案 0 :(得分:4)

在这里,我们可以查找条件的变化,特别是从TRUE到FALSE的转换。

a <- df[diff(c(condition,1)) == -1, day[1], by=group]

#    group V1
# 1:     a  5
# 2:     b  3

因此,假设条件列是FALSE作为第一级的因子。