slice ()를 사용하여 피크 간격 필터링

마일즈 V

다음 데이터 세트를 고려하십시오.

df <- tibble(
  interval = rep(1:10, 4),
  channel = rep(1:2, each = 20),
  date = parse_date(rep(c("2020-07-01", "2020-07-02", "2020-07-03", "2020-07-04"), 
             times = 2, each = 5)), 
  time = parse_time(
    rep(format(seq.POSIXt(as.POSIXct(Sys.Date() + 0.05), 
                          as.POSIXct(Sys.Date() + 0.95), length.out = 5),
               "%H:%M:%S", tz="GMT"), 8), format = "%H:%M:%S"),
  trigger = c(rep(0,5),        # Ch 1, day 1; no max
              0, 2, 0, 2, 0,   # Ch 1, day 2; 2 maxes
              rep(0, 5),       # Ch 1, day 3; no max
              0, 0, 2, 0, 0,   # Ch 1, day 4
              0, 0, 10, 0, 0,  # Ch 2, day 1
              10, rep(0, 4),   # Ch 2, day 2; max at head
              rep(0, 4), 10,   # Ch 2, day 3; max at tail
              4, 10, 4, 10, 0) # Ch 2, day 4; 2 maxes
)
# A tibble: 40 x 5
   interval channel date       time   trigger
      <int>   <int> <date>     <time>   <dbl>
 1        1       1 2020-07-01 01:12        0
 2        2       1 2020-07-01 06:36        0
 3        3       1 2020-07-01 12:00        0
 4        4       1 2020-07-01 17:24        0
 5        5       1 2020-07-01 22:48        0
 6        6       1 2020-07-02 01:12        0
 7        7       1 2020-07-02 06:36        2
 8        8       1 2020-07-02 12:00        0
 9        9       1 2020-07-02 17:24        2
10       10       1 2020-07-02 22:48        0
# ... with 30 more rows

내 데이터에는 시간 간격에 트리거 된 횟수를 매일 기록하는 센서의 10,000 개 이상의 행이 있습니다. slice ()를 사용하여 매일 최대 트리거 시간을 기준으로 2 시간 간격을 필터링하고 싶습니다. 작동하는 코드가 있지만, 곧 설명 할 특정 상황에 대한 경고를 생성합니다. 경고가 결과를 타협하지는 않지만, 경고가 없으면 더 안심할 수 있습니다. 고려해야 할 조건은 다음과 같습니다.

  • 센서가 1 일 이상 트리거되지 않음 (트리거 = 0)
  • 하루의 머리 또는 끝 부분에서 정점을 유발합니다.
  • 하루에 한 번 이상 최대 트리거 (다른 시간에 동일한 최대 값)

주로 tidyverse 및 lubridate 기능을 사용하여 코딩합니다. 지금까지 가장 잘 작동하는 코드는 다음과 같습니다.

df %>% 
  group_by(date, channel) %>%
  slice(abs(which.max(trigger) + (-1:1))) %>% # Simplifying my interval with 1 row around the peak
  ungroup() %>%
  arrange(channel) %>% 
  print()
# A tibble: 20 x 5
   interval channel date       time   trigger
      <int>   <int> <date>     <time>   <dbl>
 1        1       1 2020-07-01 01:12        0
 2        2       1 2020-07-01 06:36        0
 3        6       1 2020-07-02 01:12        0
 4        7       1 2020-07-02 06:36        2
 5        8       1 2020-07-02 12:00        0
 6        1       1 2020-07-03 01:12        0
 7        2       1 2020-07-03 06:36        0
 8        7       1 2020-07-04 06:36        0
 9        8       1 2020-07-04 12:00        2
10        9       1 2020-07-04 17:24        0
11        2       2 2020-07-01 06:36        0
12        3       2 2020-07-01 12:00       10
13        4       2 2020-07-01 17:24        0
14        6       2 2020-07-02 01:12       10
15        7       2 2020-07-02 06:36        0
16        4       2 2020-07-03 17:24        0
17        5       2 2020-07-03 22:48       10
18        6       2 2020-07-04 01:12        4
19        7       2 2020-07-04 06:36       10
20        8       2 2020-07-04 12:00        4

나는 피크가 아닌 간격으로 슬라이스하려고 생각했지만 간격이 항상 순차적 인 것은 아닙니다. 내 프로그램을 재설정하는시기에 따라 다릅니다. 피크가 2 개 이상인 경우 첫 번째 피크에 대해 필터링하는 것은 괜찮습니다. 여러 봉우리가있는 곳을 식별 할 수 있다면 그것은 플러스입니다! 마지막으로, 하루 동안 트리거가 없다면 그날을 포함하고 싶지 않습니다. 비활성을 사후 필터링 할 수 있다고 생각하지만 여전히 경고를받을 것입니다.

요약 :

내 목표는 피크 트리거 시간을 기준으로 2 시간 간격을 필터링하는 것입니다. tidyverse / lubridate (또는 정말로!) 솔루션을 추천 할 수 있다면 도움을 주시면 감사하겠습니다. 감사!

로낙 샤

경고가 생성되지 않도록 다양한 조건을 테스트하는 사용자 지정 함수를 작성할 수 있습니다.

custom_fun <- function(trigger) {
   #trigger value greater than 0
   inds <- trigger > 0
   #If any value greater than 0
   if(any(inds)) {
    #return the 2-hour interval
    vals <- which.max(trigger) + -1:1
    #remove values during head and tail of the day   
    return(vals[vals > 0 & vals <= length(trigger)])
   }
      #Don't select anything if no trigger > 0
      else return(0)
}

그런 다음 각 datechannel.

library(dplyr)

df %>% 
  group_by(date, channel) %>%
  #If multiple peaks present.
  mutate(mulitple_peak = sum(trigger == max(trigger)) > 1) %>%
  slice(custom_fun(trigger)) %>%
  ungroup()


# A tibble: 16 x 6
#   interval channel date       time   trigger mulitple_peak
#      <int>   <int> <date>     <time>   <dbl> <lgl>        
# 1        2       2 2020-07-01 06:36        0 FALSE        
# 2        3       2 2020-07-01 12:00       10 FALSE        
# 3        4       2 2020-07-01 17:24        0 FALSE        
# 4        6       1 2020-07-02 01:12        0 TRUE         
# 5        7       1 2020-07-02 06:36        2 TRUE         
# 6        8       1 2020-07-02 12:00        0 TRUE         
# 7        6       2 2020-07-02 01:12       10 FALSE        
# 8        7       2 2020-07-02 06:36        0 FALSE        
# 9        4       2 2020-07-03 17:24        0 FALSE        
#10        5       2 2020-07-03 22:48       10 FALSE        
#11        7       1 2020-07-04 06:36        0 FALSE        
#12        8       1 2020-07-04 12:00        2 FALSE        
#13        9       1 2020-07-04 17:24        0 FALSE        
#14        6       2 2020-07-04 01:12        4 TRUE         
#15        7       2 2020-07-04 06:36       10 TRUE         
#16        8       2 2020-07-04 12:00        4 TRUE     

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Elixir를 사용하여 겹치는 기간 필터링

분류에서Dev

tbl.Filter를 사용하여 두 날짜 간 필터링

분류에서Dev

VBA 매크로를 사용하여 변수로 필터링

분류에서Dev

Materialise JS를 사용하여 Scrollspy 링크를 클릭 할 때 간격을 줄입니다.

분류에서Dev

HighStock은 간격 크기를 사용하여 특정 간격으로 표시되지 않는 데이터를 보여줍니다.

분류에서Dev

WooCommerce wc_get_products를 사용하여 가격대별로 제품 필터링

분류에서Dev

스크롤 막대를 사용하여 피벗 테이블 필터 제어

분류에서Dev

Dask를 사용하여 병렬로 데이터 프레임 청크 필터링

분류에서Dev

Excel에서 매크로를 사용하여 데이터 필터링

분류에서Dev

.indexhour를 사용하여 XTS를 필터링 할 때 시간대 문제

분류에서Dev

자바 스크립트 만 사용하여 두 개의 입력으로 가격 범위를 필터링하려면 어떻게해야합니까?

분류에서Dev

스크래피를 사용하여 재귀 적으로 사이트 크롤링

분류에서Dev

자바 스크립트 또는 jquery를 사용하여 필터링 된 조회

분류에서Dev

체크 박스를 사용하여 클래스별로 div 필터링

분류에서Dev

awk를 사용하여 행 필터링

분류에서Dev

KnockOutJ를 사용하여 필터링

분류에서Dev

JcomboBox를 사용하여 JTable 필터링

분류에서Dev

BindingList를 사용하여 DataGridView 필터링

분류에서Dev

grep 또는 sed를 사용하여 html에서 링크를 필터링하는 방법은 무엇입니까?

분류에서Dev

Google 앱 스크립트 편집기를 사용하여 열의 데이터를 필터링하는 방법

분류에서Dev

Bash를 사용하여 파일 링크의 공간 다루기

분류에서Dev

Laravel을 사용하여 시간별로 데이터를 필터링하는 방법은 무엇입니까?

분류에서Dev

Excel 피벗 테이블에서 VBA를 사용하여 열 레이블을 필터링하는 방법

분류에서Dev

스크래피 xpath를 사용하여 데이터를 얻는 방법

분류에서Dev

IQueryable을 사용하여 ID를 사용하여 gridview 필터링

분류에서Dev

IBPy를 사용하여 가격 데이터의 시간대 변경 실패

분류에서Dev

자바 스크립트를 사용하여 문자열로 json 필드 필터링

분류에서Dev

awk를 사용하여 모든 빈번한 시간 간격 사이에 데이터를 읽는 방법

분류에서Dev

wc_price 필터 후크를 사용하여 제품 가격에 추가 통화 추가

Related 관련 기사

  1. 1

    Elixir를 사용하여 겹치는 기간 필터링

  2. 2

    tbl.Filter를 사용하여 두 날짜 간 필터링

  3. 3

    VBA 매크로를 사용하여 변수로 필터링

  4. 4

    Materialise JS를 사용하여 Scrollspy 링크를 클릭 할 때 간격을 줄입니다.

  5. 5

    HighStock은 간격 크기를 사용하여 특정 간격으로 표시되지 않는 데이터를 보여줍니다.

  6. 6

    WooCommerce wc_get_products를 사용하여 가격대별로 제품 필터링

  7. 7

    스크롤 막대를 사용하여 피벗 테이블 필터 제어

  8. 8

    Dask를 사용하여 병렬로 데이터 프레임 청크 필터링

  9. 9

    Excel에서 매크로를 사용하여 데이터 필터링

  10. 10

    .indexhour를 사용하여 XTS를 필터링 할 때 시간대 문제

  11. 11

    자바 스크립트 만 사용하여 두 개의 입력으로 가격 범위를 필터링하려면 어떻게해야합니까?

  12. 12

    스크래피를 사용하여 재귀 적으로 사이트 크롤링

  13. 13

    자바 스크립트 또는 jquery를 사용하여 필터링 된 조회

  14. 14

    체크 박스를 사용하여 클래스별로 div 필터링

  15. 15

    awk를 사용하여 행 필터링

  16. 16

    KnockOutJ를 사용하여 필터링

  17. 17

    JcomboBox를 사용하여 JTable 필터링

  18. 18

    BindingList를 사용하여 DataGridView 필터링

  19. 19

    grep 또는 sed를 사용하여 html에서 링크를 필터링하는 방법은 무엇입니까?

  20. 20

    Google 앱 스크립트 편집기를 사용하여 열의 데이터를 필터링하는 방법

  21. 21

    Bash를 사용하여 파일 링크의 공간 다루기

  22. 22

    Laravel을 사용하여 시간별로 데이터를 필터링하는 방법은 무엇입니까?

  23. 23

    Excel 피벗 테이블에서 VBA를 사용하여 열 레이블을 필터링하는 방법

  24. 24

    스크래피 xpath를 사용하여 데이터를 얻는 방법

  25. 25

    IQueryable을 사용하여 ID를 사용하여 gridview 필터링

  26. 26

    IBPy를 사용하여 가격 데이터의 시간대 변경 실패

  27. 27

    자바 스크립트를 사용하여 문자열로 json 필드 필터링

  28. 28

    awk를 사용하여 모든 빈번한 시간 간격 사이에 데이터를 읽는 방법

  29. 29

    wc_price 필터 후크를 사용하여 제품 가격에 추가 통화 추가

뜨겁다태그

보관