Подведение итогов таблицы в виде матрицы - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть данные, в каких областях встречаются определенные виды, где 1 = присутствует, а 0 = отсутствует.Я хотел бы создать попарную матрицу, суммирующую количество видов с общими областями.Это пример моих данных:

Мои данные:

structure(c(0.5, 0.3, 0.25, 0.5, 0.3, 0.25, 0, 0.3, 0.25, 0, 0, 0.25), .Dim = 3:4, 
          .Dimnames = list(c("Species1", "Species2", "Species3"), 
                           c("AreaA", "AreaB", "AreaC", "AreaD")))

         AreaA AreaB AreaC AreaD
Species1  0.5   0.5   0     0
Species2  0.3   0.3   0.3   0
Species3  0.25  0.25  0.25  0.25

И в конце я бы хотел что-то вроде этого:

      AreaA AreaB AreaC AreaD
AreaA     0   2.1   1.1   0.5
AreaB         0     1.1   0.5
AreaC               0     0.5
AreaD                     0

У меня есть списокиз более чем 50 000 видов мне нужно подвести итоги для общих областей.

1 Ответ

0 голосов
/ 22 февраля 2019

Редактировать:

Теперь кажется, что вы пытаетесь суммировать содержимое столбцов, где эти столбцы больше нуля.Это сбивает с толку, потому что первая часть вашего вопроса больше не применяется (0 = отсутствует, 1 = присутствует).Поэтому я оставил ваши исходные данные и решение исходной проблемы ниже.Если вы уточните, что именно вы хотите, я также могу уточнить ответ.

Матрица, которую вы сейчас имеете в своем вопросе, может быть получена следующим образом:

M <- structure(c(0.5, 0.3, 0.25, 0.5, 0.3, 0.25, 0, 0.3, 0.25, 0, 0, 0.25), .Dim = 3:4, 
          .Dimnames = list(c("Species1", "Species2", "Species3"), 
                           c("AreaA", "AreaB", "AreaC", "AreaD")))

Shared <- matrix(0, nrow = ncol(M), ncol = ncol(M))
rownames(Shared) <- colnames(M)
colnames(Shared) <- colnames(M)
for(i in 1:ncol(M)){
    Shared[i, -i] <- apply(M[, -i], 2, function(x){sum(pmin(M[, i] + x)[M[, i] > 0 & x > 0])})
}

> print(Shared)
      AreaA AreaB AreaC AreaD
AreaA   0.0   2.1   1.1   0.5
AreaB   2.1   0.0   1.1   0.5
AreaC   1.1   1.1   0.0   0.5
AreaD   0.5   0.5   0.5   0.0

Старый ответ

Это решение суммирует количество существующих видов среди областей:

M <- matrix(c(1,1,0,0,
              1,1,0,0,
              0,0,1,1), nrow = 3, byrow = TRUE)

colnames(M) <- paste0("Area", LETTERS[1:4])
rownames(M) <- paste0("Species", 1:3)

Shared <- matrix(0, nrow = ncol(M), ncol = ncol(M))
rownames(Shared) <- colnames(M)
colnames(Shared) <- colnames(M)
for(i in 1:ncol(M)){
  Shared[i, -i] <- apply(M[, -i], 2, function(x){sum(M[, i] == 1 & x == 1)})
}

Если вы хотите отобразить только верхний треугольник, просто сделайте это:

Shared[lower.tri(Shared)] <- '' # or NA if you want the numbers to stay numbers
print(Shared)

> print(Shared)
      AreaA AreaB AreaC AreaD
AreaA "0"   "2"   "0"   "0"  
AreaB ""    "0"   "0"   "0"  
AreaC ""    ""    "0"   "1"  
AreaD ""    ""    ""    "0"  

Если вы просто пытаетесь найти области с большим перекрытием, вы также можете просто использовать вместо этого функцию расстояния (например, dist(t(M), method = "manhattan")).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...