Я пытаюсь отфильтровать демографические данные кораллов во временном ряду. У меня есть набор кораллов, которые измеряют каждые 3 месяца. Что я хочу сделать, так это а.) Фильтровать все кораллы, которые в какой-то момент имели максимальный диаметр в пределах указанного диапазона размеров (диаметр 8-12 мм), б.) Удалить кораллы, которые ранее были больше, чем диапазон размеров, и в. .) удалите измерения кораллов, которые попали в размерный диапазон ПОСЛЕ того, как он вырос за пределы или за пределы диапазона размеров, включив для каждого коралла только ПЕРВОЕ измерение, в котором он вырос в размерный диапазон (8-12 мм), и последующее измерение в следующем. Шаг времени.
Я создал образец базы данных и желаемую базу данных, чтобы конкретно проиллюстрировать то, что я ищу. В образец базы данных я также включил все критерии, перечисленные для каждого коралла ниже, в разделе примечаний рядом с первой записью для каждого коралла для вашей справки. Вот 8 кораллов, которые я включил в базу данных, и словами, что я хочу с ними сделать:
Коралл №1 следует полностью удалить из базы данных, так как он не соответствует желаемому диапазону размеров 8–12 мм.
Коралл № 2 должен быть удален из базы данных, потому что он начинался выше желаемого диапазона размеров, затем уменьшался ниже него, а затем превратился в него. Мне нужны только кораллы, которые выросли до нужного размера, но не уменьшились в размерах заранее.
Коралл № 3 - это пример коралла, который вырос до размера (8–12 мм) и выше без усадки, и это коралл, который я хочу оставить, потому что он вырос до этого размера. Однако я хочу включить только ПЕРВУЮ меру внутри диапазона размеров (9 мм в данном случае в TimeStep 3) и текущее измерение (12 мм в данном случае для TimeStep 4).
Коралл № 4 - это пример коралла, размер которого вырос и остался выше допустимого диапазона, поэтому его необходимо удалить.
Коралл № 5 - это пример коралла, который начинался ниже диапазона, вырос в него, а затем снова сжался до этого диапазона (TimeStep 4). Для этого сценария я хочу включить только первый раз, когда диаметр попал в диапазон (TimeStep 2) и текущее измерение (TimeStep 3), а не второй раз, когда он попал в диапазон. Это потому, что первый раз - естественный рост, тогда как второй раз - усадка и ее результирующее восстановление (которое я хочу исключить или отфильтровать).
Коралл № 6 - это пример коралла, который начинался в диапазоне размеров для TimeStep 1, а затем вырастал из него на следующем TimeStep и продолжал расти после. Я хочу сохранить только измерения в TimeStep 1 и 2 (первое измерение внутри диапазона и продолжающееся измерение)
Коралл № 7 является примером коралла, который начинался в диапазоне размеров в TimeStep 1, а затем оставался в диапазоне для TimeStep 2. В этом случае мне нужно только первое измерение в диапазоне размеров (TimeStep 1) и последующее измерение ( TimeStep 2)
Коралл № 8 является примером коралла, который вырос до диапазона размеров в TimeStep 3, оставался в диапазоне (10 => 9) в TimeStep 4, затем сжался ниже желаемого диапазона, а затем для TimeStep 6 снова вырос до диапазона. Для этой колонии я снова хочу, чтобы ПЕРВОЕ измерение внутри диапазона (10 мм на TimeStep 3) и продолжающееся измерение в TimeStep 4 было включено для этого коралла.
Коралл № 9 - это пример коралла, который вырос до размера, указанного на временном шаге 3 (9 мм), но не был обнаружен на следующем временном шаге (NF для столбца кода состояния с измерением как NA). Я хочу сохранить такие кораллы в наборе данных, чтобы рассчитать выживаемость.
В общем, мне нужен код, который фильтрует эту базу данных таким образом, чтобы если коралл в какой-то момент имел диаметр в диапазоне размеров 8-12 см, но ранее был больше этого диапазона, никогда не был в диапазоне или ниже диапазона или начинался ниже диапазона и никогда не попадали в нее, они полностью удаляются из базы данных. Кроме того, я хочу сохранить все кораллы, которые выросли до диапазона, а затем сжались до него, в базе данных, удаляя их во второй раз, когда они попадали в диапазон. Это можно сделать, удалив все измерения, ЗА ИСКЛЮЧЕНИЕМ первого временного шага, в котором коралл вырос до определенного диапазона размеров, и следующего измерения временного шага.
ПРИМЕР БАЗЫ ДАННЫХ
data <- structure(list(Site = c("WAI", "WAI", "WAI", "WAI", "WAI", "WAI",
"WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI",
"WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI",
"WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI",
"WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI",
"WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI", "WAI",
"WAI"), `Module #` = c(116, 116, 116, 116, 116, 116, 116, 115,
115, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
116, 116, 116, 116, 116), Side = c("N", "N", "N", "N", "N", "N",
"N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N",
"N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N",
"N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N",
"N", "N", "N", "N", "N", "N", "N"), TimeStep = c(1, 2, 3, 4,
5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1,
2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4,
5, 6, 1, 2, 3, 4), Settlement_Area = c(0.75902336, 0.75902336,
0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336,
0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336,
0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336,
0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336,
0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336,
0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336,
0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336,
0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336,
0.75902336, 0.75902336), `Colony #` = c(1, 1, 1, 1, 1, 1, 2,
2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9,
9, 9, 9), Location = c("C1", "C1", "C1", "C1", "C1", "C1", "B4",
"B4", "B4", "B4", "B4", "B4", "A1", "A1", "A1", "A1", "A1", "A1",
"B3", "B3", "B3", "B3", "B3", "B3", "D1", "D1", "D1", "D1", "D1",
"D1", "A2", "A2", "A2", "A2", "A2", "A2", "A4", "A4", "A4", "A4",
"A4", "A4", "B3", "B3", "B3", "B3", "B3", "B3", "A3", "A3", "A3",
"A3"), `Taxonomic Code` = c("PC", "PC", "PC", "PC", "PC", "PC",
"PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC",
"PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC",
"PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC",
"PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC", "PC",
"PC", "PC"), `Cover Code` = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA),
`Max Diameter (cm)` = c(5, 7, 13, 15, 16, 19, 15, 7, 9, 11,
14, 18, 3, 6, 9, 12, 15, 20, 13, 16, 18, 21, 23, 26, 6, 9,
14, 12, 15, 18, 11, 14, 17, 17, 21, 24, 9, 11, 14, 16, 20,
22, 3, 6, 10, 9, 7, 10, 4, 6, 9, NA), `Status Code` = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, "NF"), Notes = c("coral # 1 should be deleted from the database because it skipped over the desired size range of 8-12 mm",
NA, NA, NA, NA, NA, "coral # 2 should be deleted from the database because it started above the desired size range then shrank back into it. I only want corals that have grown into the size range",
NA, NA, NA, NA, NA, "Colony # 3 is an example of a coral that grew to the size range (8-12 mm) and beyond without shrinking and this is a coral that I want to keep because it grew to the size range. However, I want to only include the FIRST measure inside the size range (9 mm in this case) and the proceeding measurement (12 mm)",
NA, NA, NA, NA, NA, "Colony # 4 is an example of a coral that started off above the size range and therefore needs to be removed.",
NA, NA, NA, NA, NA, "Colony # 5 is an example of a coral that started below the range, grew into it, then later shrank back into the range (TimeStep 4). For this scenario, I want to only include the first time the diameter fell into the range (TimeStep 2) and the proceeding measurement, not the second time it fell into the range. This is because the first time is natural growth whereas the second time is shrinkage and its resulting recovery (which I want to exclude or filter out).",
NA, NA, NA, NA, NA, "Colony # 6 is an example of a coral that started in the size range for TimeStep 1 and then grew out of it in the next TimeStep and continued to grow after. I want to maintain only the measurements in TimeStep 1 and 2 (the first measure inside the range and the proceeding measurement)",
NA, NA, NA, NA, NA, "Colony # 7 is an example of a coral that started in the size range in TimeStep 1 and then remained in the range for TimeStep 2. In this case I only want the first measurement in the size range (TimeStep 1) and the subsequent measurement (TimeStep 2)",
NA, NA, NA, NA, NA, "Colony # 8 is an example of a coral that grew to the size range in TimeStep 3, stayed in the range (10 => 9) in TimeStep 4, then shrank below the desired range then for TimeStep 6 grew back to the range. For this colony, again I want the FIRST measurement inside the range (10 mm at TimeStep 3) and the proceeding measurement in TimeStep 4 included for this coral",
NA, NA, NA, NA, NA, NA, NA, NA, NA)), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -52L), spec = structure(list(
cols = list(Site = structure(list(), class = c("collector_character",
"collector")), `Module #` = structure(list(), class = c("collector_double",
"collector")), Side = structure(list(), class = c("collector_character",
"collector")), TimeStep = structure(list(), class = c("collector_double",
"collector")), Settlement_Area = structure(list(), class = c("collector_double",
"collector")), `Colony #` = structure(list(), class = c("collector_double",
"collector")), Location = structure(list(), class = c("collector_character",
"collector")), `Taxonomic Code` = structure(list(), class = c("collector_character",
"collector")), `Cover Code` = structure(list(), class = c("collector_double",
"collector")), `Max Diameter (cm)` = structure(list(), class = c("collector_double",
"collector")), `Status Code` = structure(list(), class = c("collector_character",
"collector")), Notes = structure(list(), class = c("collector_character",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))
ЖЕЛАТЕЛЬНАЯ БАЗА ДАННЫХ
data_final <- structure(list(Site = c("WAI", "WAI", "WAI", "WAI", "WAI", "WAI",
"WAI", "WAI", "WAI", "WAI", "WAI", "WAI"), `Module #` = c(116,
116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116), Side = c("N",
"N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N"), TimeStep = c(3,
4, 2, 3, 1, 2, 1, 2, 3, 4, 3, 4), Settlement_Area = c(0.75902336,
0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336,
0.75902336, 0.75902336, 0.75902336, 0.75902336, 0.75902336),
`Colony #` = c(3, 3, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9), Location = c("A1",
"A1", "D1", "D1", "A2", "A2", "A4", "A4", "B3", "B3", "B2",
"B2"), `Taxonomic Code` = c("PC", "PC", "PC", "PC", "PC",
"PC", "PC", "PC", "PC", "PC", "PC", "PC"), `Cover Code` = c(1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA), `Max Diameter (cm)` = c(9,
12, 9, 14, 11, 14, 9, 11, 10, 9, 9, NA), `Status Code` = c(NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "NF")), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -12L), spec = structure(list(
cols = list(Site = structure(list(), class = c("collector_character",
"collector")), `Module #` = structure(list(), class = c("collector_double",
"collector")), Side = structure(list(), class = c("collector_character",
"collector")), TimeStep = structure(list(), class = c("collector_double",
"collector")), Settlement_Area = structure(list(), class = c("collector_double",
"collector")), `Colony #` = structure(list(), class = c("collector_double",
"collector")), Location = structure(list(), class = c("collector_character",
"collector")), `Taxonomic Code` = structure(list(), class = c("collector_character",
"collector")), `Cover Code` = structure(list(), class = c("collector_double",
"collector")), `Max Diameter (cm)` = structure(list(), class = c("collector_double",
"collector")), `Status Code` = structure(list(), class = c("collector_character",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))
До сих пор мне удавалось получать кораллы, которые никогда не были в диапазоне размеров, путем создания вектора уникальных номеров колоний, которые попадали в диапазон от 8 до 12 мм:
size_vect <- seq(from = 8, to = 12, by = 1)
# a vector containing the range of diameter measurements we want to filter for
ID_vect <- data %>% group_by(`Colony #`) %>%
filter(`Max Diameter (cm)` > min(size_vect) & `Max Diameter (cm)` < max(size_vect)) %>%
# select all measures where the coral fell within the size range
distinct(`Colony #`) %>%
# remove duplicate colony numbers
pull(`Colony #`)
# make the column `Colony #` in the dataframe ID_vect into a vector
Затем я отфильтровал всю базу данных образцов, чтобы включить только колонии кораллов из ID_vect:
data_new <- data %>% group_by(`Colony #`) %>%
filter(`Colony #` %in% ID_vect)
# filter for all corals that contain the same colony number as those in the ID_vect
Я не знаю, как теперь фильтровать базу данных на основе следующего условия: если коралл попадал в диапазон размеров в какой-то момент, но предыдущее измерение было БОЛЬШЕ, чем максимальное значение желаемого диапазона размеров (12 мм), этот коралл должен удалить полностью. Например, Коралл № 2 должен быть удален, потому что до того, как значение попало в диапазон в TimeStep 3, оно составляло 15 мм в TimeStep 1, что превышает диапазон.
Кроме того, я не знаю, как учесть, не было ли измерения в следующем измерении TimeStep, например, с Coral # 9, где оно было измерено как 9 мм в TimeStep 3 и не было обнаружено (NF в коде состояния) в TimeStep 4. Мне нужно сохранить измерение TimeStep 4 для расчета выживаемости. Я не знаю, как закодировать этот условный фильтр, и здесь мне нужна помощь. Любой совет по коду приветствуется, спасибо!