Скрипт на R для работы - Часть II

# ввожу данные из файла и заменяю в ячейках отсутствующие данные на нули
territoria <- read.csv(file = (description = "e:/10pl.csv"),
                      sep = ";", h=F, dec = ",")
territoria[is.na(territoria == "NA")] <- 0

# создаю заготовки матриц
# группа основных индексов
v_I_S <- NULL # для индекса Сёренсена
v_I_S <- as.data.frame(v_I_S[length(territoria), length(territoria)])

v_I_J <- NULL # для индекса Жаккара
v_I_J <- as.data.frame(v_I_J[length(territoria), length(territoria)])

v_I_SM <- NULL # для индекса Сокала и Майченера
v_I_SM <- as.data.frame(v_I_SM[length(territoria), length(territoria)])

v_K_Cz <- NULL # для меры Чекановского
v_K_Cz <- as.data.frame(v_K_Cz[length(territoria), length(territoria)])

v_K_R <- NULL # для меры Ружички
v_K_R <- as.data.frame(v_K_R[length(territoria), length(territoria)])

# группа дополнительных индексов
v_I_BB <- NULL # для индекса Браун-Бланке
v_I_BB <- as.data.frame(v_I_BB[length(territoria), length(territoria)])

v_I_SzS <- NULL # для индекса Шимкевича и Симпсона
v_I_SzS <- as.data.frame(v_I_SzS[length(territoria), length(territoria)])

v_I_K1 <- NULL # для первого индекса Кульчинского
v_I_K1 <- as.data.frame(v_I_K1[length(territoria), length(territoria)])

v_I_OB <- NULL # для индекса Отиаи и Баркмана
v_I_OB <- as.data.frame(v_I_OB[length(territoria), length(territoria)])

v_I_SS <- NULL # для индекса Сокала и Снита
v_I_SS <- as.data.frame(v_I_SS[length(territoria), length(territoria)])

v_I_K2 <- NULL # для второго индекса Кульчинского
v_I_K2 <- as.data.frame(v_I_K2[length(territoria), length(territoria)])

v_I_BUB <- NULL # для индекса Барони-Урбани и Бюссера
v_I_BUB <- as.data.frame(v_I_BUB[length(territoria), length(territoria)])

v_K_MH <- NULL # для меры Мориситы и Хорна
v_K_MH <- as.data.frame(v_K_MH[length(territoria), length(territoria)])

# начинаю цикл
for(i in 1:length(territoria)) {
  wp_1 <- territoria[, i] # считываю первую выборку
  for(j in 1:length(territoria)) {
    wp_2 <- territoria[, j] # считываю вторую выборку
    
    # задаю счётные переменные
    a <- 0 # число видов, общих для двух списков
    b <- 0 # число видов, присутствующих только во втором списке
    c <- 0 # число видов, присутствующих только в первом списке
    d <- 0 # число видов, отсутствующих в обоих списках, но присутствующих в системе
    
    v_min <- 0 # сумма минимальных обилий из каждой пары
    v_max <- 0 # сумма максимальных обилий из каждой пары
    
    mn <- 0 # сумма произведений обилий
    
    sq_1 <- 0 # сумма квадратов обилий на первой площадке
    sq_2 <- 0 # сумма квадратов обилий на второй площадке
    
    # выполняю подсчёт основных параметров
      for(k in 1:length(wp_1)) {
      
      # считаю числа видов
      ifelse(wp_1[k] != 0 & wp_2[k] != 0, a <- a + 1, a <- a)
      ifelse(wp_1[k] != 0 & wp_2[k] == 0, b <- b + 1, b <- b)
      ifelse(wp_1[k] == 0 & wp_2[k] != 0, c <- c + 1, c <- c)
      ifelse(wp_1[k] == 0 & wp_2[k] == 0, d <- d + 1, d <- d)
      
      # считаю суммарные обилия
      v_min <- v_min + min(wp_1[k], wp_2[k])
      v_max <- v_max + max(wp_1[k], wp_2[k])
      
      # считаю сумму произведений обилий
      mn <- mn + wp_1[k] * wp_2[k]
      
      # считаю сумму квадратов обилий
      sq_1 <- sq_1 + wp_1[k]^2
      sq_2 <- sq_2 + wp_2[k]^2
    }
    
    # подсчитываю число видов в каждой выборке
    S_1 <- length(wp_1) - length(which(wp_1 == 0))
    S_2 <- length(wp_2) - length(which(wp_2 == 0))
    
    # подсчитываю суммарное обилие по каждой выборке
    v_S_1 <- sum(wp_1)
    v_S_2 <- sum(wp_2)
    
    # рассчитываю индексы и заполняю матрицы
    # группа основных индексов
    I_S <- (2 * a) / ((a + b) + (a + c)) # считаю индекс Сёренсена
    v_I_S[i, j] <- I_S # заношу его в соответствующую ячейку
    
    I_J <- a / (a + b + c) # считаю индекс Жаккара
    v_I_J[i, j] <- I_J # заношу его в соответствующую ячейку
    
    I_SM <- (a + d) / (a + b + c + d) # считаю индекс Сокала и Майченера
    v_I_SM[i, j] <- I_SM # заношу его в соответствующую ячейку
    
    K_Cz <- 2 * v_min / (v_S_1 + v_S_2) # считаю меру Чекановского
    v_K_Cz[i, j] <- K_Cz # заношу её в соответствующую ячейку
    
    K_R <- v_min / v_max # считаю меру Ружички
    v_K_R[i, j] <- K_R # заношу её в соответствующую ячейку
    
    # группа дополнительных индексов
    I_BB <- a / max(S_1, S_2) # считаю индекс Браун-Бланке
    v_I_BB[i, j] <- I_BB # заношу его в соответствующую ячейку
    
    I_SzS <- a / min(S_1, S_2) # считаю индекс Шимкевича и Симпсона
    v_I_SzS[i, j] <- I_SzS # заношу его в соответствующую ячейку
    
    I_K1 <- (a / 2) * (1 / (a + b) + 1 / (a + c)) # считаю первый индекс Кульчинского
    v_I_K1[i, j] <- I_K1 # заношу его в соответствующую ячейку
    
    I_OB <- a / sqrt((a + b) * (a + c)) # считаю индекс Отиаи и Баркмана
    v_I_OB[i, j] <- I_OB # заношу его в соответствующую ячейку
    
    I_SS <- a / (2 * (a + b + c) - a) # считаю индекс Сокала и Снита
    v_I_SS[i, j] <- I_SS # заношу его в соответствующую ячейку
    
    I_K2 <- a / (b + c) # считаю второй индекс Кульчинского
    v_I_K2[i, j] <- I_K2 # заношу его в соответствующую ячейку
    
    I_BUB <- (sqrt(a * d) + a) / (sqrt(a * d) + a + b + c) # считаю индекс Барони-Урбани и Бюссера
    v_I_BUB[i, j] <- I_BUB # заношу его в соответствующую ячейку
    
    K_MH <- (2 * mn) / ((sq_1 / (S_1^2) + sq_2 / (S_2^2)) * S_1 * S_2) # считаю меру Мориситы и Хорна
    v_K_MH[i, j] <- K_MH # заношу её в соответствующую ячейку
  }
}

Последнее изменение: Четверг, 18 ноября 2021, 13:31