识别id和segment中的一系列连续数字

时间:2017-10-27 12:35:43

标签: r count panel tidyr

我有一个小组$(function(){ $('.datepicker').datetimepicker({ autoclose: true, viewMode: 'years', format: 'DD/MM/YYYY', }); ,我在其中尝试在变量dfL中识别id,id和段shift中的系列连续数字。我正在寻找包含数字PM-1的系列连续数字,其长度为1或更长。

下面是我对数据情况的说明,

4

我最初有这样的宽格式数据,

# install.packages(c("tidyverse"), dependencies = TRUE)
library(tibble)

在此dfa <- tibble(id = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7), PM01 = c(NA, -3, NA, -2, -1, 1, 2, NA, NA, -2, -1, NA, -3, -2, -1, 1, 2, 3, NA, NA, -2, -1, 1, 2, 3, NA, NA, NA, NA, NA), PM02 = c(1, -2, NA, NA, NA, -3, -2, -1, NA, 1, 2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, -1, 1, 2, NA, NA, NA, NA, NA), PM03 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, -3, -2, -1, 1, 2, 3, NA, NA) );dfa #> # A tibble: 30 x 4 #> id PM01 PM02 PM03 #> <dbl> <dbl> <dbl> <dbl> #> 1 0 NA 1 NA #> 2 0 -3 -2 NA #> 3 0 NA NA NA #> 4 0 -2 NA NA #> 5 0 -1 NA NA #> 6 0 1 -3 NA #> 7 0 2 -2 NA #> 8 0 NA -1 NA #> 9 0 NA NA NA #> 10 0 -2 1 NA #> # ... with 20 more rows PM01将匹配。

4-7数据长到只有一个向量我必须查看。像这样,

tidyr::gather

我试着解释我在寻找什么,但发现如果我只是展示我想要的结果可能会更清楚。像这样,

# install.packages(c("tidyverse"), dependencies = TRUE)
library(tidyr)
dfL <- dfa  %>% select(id, PM01:PM03) %>% gather(shift, PM, PM01:PM03, na.rm = FALSE) %>% arrange(id, shift)  %>% group_by(id, shift)

1 个答案:

答案 0 :(得分:1)

无论效率如何,你都可以这样做;从dfL开始,创建一个新的组变量,用于标识连续的NA或非NA块,然后通过检查每个块中的条件来添加条件列:

dfL %>% 
    group_by(g = cumsum(is.na(PM) != lag(is.na(PM), default=0)), add=T) %>% 
    mutate(TF = n() >= 4 && all(c(-1,1) %in% PM)) %>% 
    ungroup() %>% select(-g)

# A tibble: 90 x 4
#      id shift    PM    TF
#   <dbl> <chr> <dbl> <lgl>
# 1     0  PM01    NA FALSE
# 2     0  PM01    -3 FALSE
# 3     0  PM01    NA FALSE
# 4     0  PM01    -2  TRUE
# 5     0  PM01    -1  TRUE
# 6     0  PM01     1  TRUE
# 7     0  PM01     2  TRUE
# 8     0  PM01    NA FALSE
# 9     0  PM01    NA FALSE
#10     0  PM01    -2 FALSE
# ... with 80 more rows