我正在进行一项研究,我们使用放置在巢箱内的相机来确定我们的研究物种何时产下第一个蛋。有些相机不太可靠,我想看看在产下第一颗蛋的日期之前是否有连续的照片。这样我就不能确定这是不是第一次鸡蛋约会。有超过 165,000 张照片和超过 200 个巢,因此我按巢箱 ID 进行分组,将行过滤到至少有 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 行,以确保到目前为止有连续的数据。有没有办法使用 slice 或其他 dplyr 函数来执行此行索引?
最佳答案
这是一种方法。 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
关于r - 使用 dplyr 选择筛选行之前的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53622509/