Выберите строки перед отфильтрованной строкой, используя dplyr - PullRequest
0 голосов
/ 05 декабря 2018

Я работаю над исследованием, в котором мы использовали камеру, помещенную в гнездовой ящик, чтобы определить, когда наш исследуемый вид откладывал свое первое яйцо.Некоторые из камер не были сверхнадежными, и я хотел бы увидеть, были ли непрерывные фотографии до даты, когда было снесено первое яйцо.Таким образом, я не могу с уверенностью сказать, что это первое яйцо даты.Имеется> 165 000 фотографий и> 200 гнезд, поэтому я сгруппировал их по идентификатору ящика, отфильтровал строки до тех, у которых было по крайней мере 1 яйцо, а затем использовал функцию среза, чтобы выбрать первую строку с данными.Вот воспроизводимый пример:

example <- structure(list(boxID = c("CA10", "CA10", "CA10", "CA10", "CA10", 
    "CA10", "CA10", "CA10", "CA10", "CA10", "CA10", "CA10", "CA10", 
    "CA10", "CA10"), visitType = c("Image", "Image", "Image", "Image", 
    "Image", "Image", "Image", "Image", "Image", "Image", "Image", 
    "Image", "Image", "Image", "Image"), day = c(25L, 25L, 25L, 26L, 
    26L, 26L, 27L, 27L, 27L, 28L, 28L, 28L, 29L, 29L, 29L), month = c("MAR", 
    "MAR", "MAR", "MAR", "MAR", "MAR", "MAR", "MAR", "MAR", "MAR", 
    "MAR", "MAR", "MAR", "MAR", "MAR"), year = c(2018, 2018, 2018, 
    2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 
    2018), timeChecked = c("02:59", "09:06", "15:13", "02:59", "09:07", 
    "15:14", "02:59", "09:07", "15:13", "02:58", "09:06", "15:12", 
    "02:58", "09:06", "15:12"), species = c("Empty", "Empty", "Empty", 
    "Empty", "Empty", "Empty", "Empty", "Empty", "American Kestrel", 
    "Empty", "American Kestrel", "American Kestrel", "American Kestrel", 
    "American Kestrel", "American Kestrel"), sexAdult = c(NA, NA, 
    NA, NA, NA, NA, NA, NA, "Female", NA, "Female", "Female", "Female", 
    NA, NA), numEggs = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    "1", "1", "1", "1", "1"), numNestlings = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_), date = structure(c(17615, 
    17615, 17615, 17616, 17616, 17616, 17617, 17617, 17617, 17618, 
    17618, 17618, 17619, 17619, 17619), class = "Date")), class = c("tbl_df", 
    "tbl", "data.frame"), row.names = c(NA, -15L), .Names = c("boxID", 
    "visitType", "day", "month", "year", "timeChecked", "species", 
    "sexAdult", "numEggs", "numNestlings", "date"))

Вот код, который я должен найти в первой строке, в которой есть хотя бы 1 яйцо:

example %>%
      mutate_at(vars(numEggs, numNestlings), na_if, 'unknown') %>% # remove unknowns and other values that should be NA
      select(boxID, date, numEggs, visitType) %>%
      group_by(boxID) %>%
      filter(numEggs > 0) %>%
      slice(1) 

Я хотел бы посмотреть на 5 илиЗа 10 строк до этой первой строки с яйцом, чтобы убедиться, что до этого момента были непрерывные данные.Есть ли способ сделать индексирование строк с помощью слайса или какой-либо другой функции dplyr?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Здесь способ, основанный на разрезании в соответствии с положением первого не пропущенного значения numEggs.Вы можете изменить значение 5 в последней строке в соответствии со строками, которые вы хотите сохранить до первого не-NA numEggs

example %>%
      mutate_at(vars(numEggs, numNestlings), na_if, 'unknown') %>%
      select(boxID, date, numEggs, visitType) %>%
      group_by(boxID) %>%
      slice((min(which(!is.na(numEggs)))-5):min(which(!is.na(numEggs))))

    # A tibble: 6 x 4
# Groups:   boxID [1]
  boxID date       numEggs visitType
  <chr> <date>     <chr>   <chr>    
1 CA10  2018-03-26 NA      Image    
2 CA10  2018-03-27 NA      Image    
3 CA10  2018-03-27 NA      Image    
4 CA10  2018-03-27 NA      Image    
5 CA10  2018-03-28 NA      Image    
6 CA10  2018-03-28 1       Image 
0 голосов
/ 05 декабря 2018

Вот один из способов.match возвращает позицию первого numEggs > 0, а затем мы просто получаем дополнительные n_previous строки из этой позиции.Мы используем max(1, ...), чтобы не получить ошибку, если позиция первая numEggs > 0 < n_previous.

n_previous <- 5

example %>%
  mutate_at(vars(numEggs, numNestlings), na_if, 'unknown') %>% 
  select(boxID, date, numEggs, visitType) %>%
  group_by(boxID) %>%
  slice(max(1, match(TRUE, numEggs > 0) - n_previous):match(TRUE, numEggs > 0))

# A tibble: 6 x 4
# Groups:   boxID [1]
  boxID date       numEggs visitType
  <chr> <date>     <chr>   <chr>    
1 CA10  2018-03-26 <NA>    Image    
2 CA10  2018-03-27 <NA>    Image    
3 CA10  2018-03-27 <NA>    Image    
4 CA10  2018-03-27 <NA>    Image    
5 CA10  2018-03-28 <NA>    Image    
6 CA10  2018-03-28 1       Image  
...