Есть ли способ в R подсчитать количество вхождений события между двумя различными событиями? - PullRequest
2 голосов
/ 17 апреля 2020

Я анализирую управление во вращающемся лесном хозяйстве, где лес засаживается, затем, когда он растет, его несколько раз прореживают, собирая несколько деревьев, а затем, в конце концов, все деревья вырубаются.

Вот пример того, как мои данные могут выглядеть:

year <- rep(seq(1,10, 1),3)
stand <- c(rep(1,10),rep(2,10),rep(3,10))
treatment <- c("planting", "none", "thinning", "none", "thinning", "none", "none", "felling", "planting", "none",
               "none", "planting", "thinning", "thinning", "thinning","none", "felling", "planting", "thinning", "none",
               "planting", "none", "thinning","none", "felling", "planting", "thinning","none", "thinning", "felling")
data <- data.frame(year,stand,treatment)

Три стойки имеют очень разные повороты.

  • Стенд 1 высаживается в первый год, затем дважды прореживается и рубится в 8-м году, а затем снова высаживается в 9-м. Существует один полный оборот и 2 сруба за оборот
  • Стенд 2 высаживается в год 2, 3 раза прореживается, а в 7 год вырубается. После этого новый лес высаживается и прореживается один раз, но севооборот не завершается. Таким образом, происходит одно вращение, и на одно вращение приходится 3 прореживания.
  • Стойка 3 имеет два вращения с одним прореживанием во вращении 1 и двумя во вращении 2. Результат должен показать, что в среднем имеется 1,5 прореживания на вращение.

У меня есть тысячи стендов со всеми видами графиков вращения, поэтому подсчитать это вручную для меня невозможно. Как я могу написать скрипт для расчета количества прореживаний за полный оборот (годы между посадкой и рубкой)?

В конце я хотел бы иметь таблицу с номером стенда и количеством прореживаний за полный оборот Все неполные повороты должны быть отброшены.

1 Ответ

1 голос
/ 17 апреля 2020

Для каждого stand мы можем хранить все между первым 'planting' и последним 'felling', поскольку мы хотим рассмотреть только полное вращение. Затем мы вычисляем число 'thinning' и делим его на число 'planting', которое произошло в этом stand, чтобы получить истончение за оборот.

library(dplyr)

data %>%
  group_by(stand) %>%
  filter(between(row_number(), min(which(treatment == 'planting')), 
                               max(which(treatment == 'felling')))) %>%
  summarise(thin_per_rotation = sum(treatment == 'thinning')/
                                sum(treatment == 'planting'))


#  stand thin_per_rotation
#  <dbl>             <dbl>
#1     1               2  
#2     2               3  
#3     3               1.5
...