2017-10-27 9 views
0

ID가 id이고 세그먼트가 PM 인 세그먼트에 일련 번호가 연속적으로 표시되도록 패널 번호가 dfL인데, 여기에 이라는 세그먼트가 있습니다. 일련 번호가 -11이고 길이가 4 이상인 시리즈를 찾고 있습니다. 데이터와 상황에 내 그림 아래은 ID와 세그먼트 내 연속 일련 번호를 나타냅니다.

,

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

나는 처음 4-7이 일치하는 것이이 PM01 행에서

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 

,이 같은 다양한 형식의 데이터를 가지고있다.

저는 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) 

나는 내가 무엇을 찾고 설명했지만, 나는 단순히 내 원하는 결과를 보여주는 경우가 명확 수 있습니다 발견. 이와 같이

cbind(dfL, TF = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, 
TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE)) 
# A tibble: 90 x 4 
# Groups: id, shift [9] 
     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 FALSE 
5  0 PM01 -1 FALSE 
6  0 PM01  1 FALSE 
7  0 PM01 NA FALSE 
8  0 PM01 NA FALSE 
9  0 PM01 NA FALSE 
10  0 PM01 -2 FALSE 
# ... with 80 more rows 

답변

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