Преобразовать региональное происхождение вида в матрицу присутствия / отсутствия - PullRequest
0 голосов
/ 15 мая 2019

У меня есть датафрейм, где первый столбец - это название вида, а второй столбец - где обитает вид, закодированный по площади.Я хочу преобразовать этот фрейм данных в матрицу присутствия / отсутствия, где строки - это названия видов, столбцы - это области, а каждая запись (после заголовка) представляет собой серию из 0 (обозначающих отсутствие в данном регионе) и 1 (обозначает присутствие в данном регионе).

Пример ввода:

    species     regions
    species1    area1
    species2    area2,area3
    species3    area2,area3

Желаемый вывод:

   species  area1   area2   area3
   species1     1       0       0 
   species2     0       1       1
   species3     0       1       1

У кого-нибудь есть какие-либо предложения о том, как выполнить это преобразование в R?

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Мы можем сделать это легко с base R, разделив столбец 'регионов' на ,, установив имена элементов list с "видами", преобразовав list в двух столбец data.frame.с stack и получить частоту с table

table(stack(setNames(strsplit(df1$regions, ","), df1$species)))
#     ind
#values  species1 species2 species3
#  area1        1        0        0
#  area2        0        1        1
#  area3        0        1        1

или более компактно с mtabulate

library(qdapTools)
cbind(df1[1], mtabulate(strsplit(df1$regions, ",")))
#    species area1 area2 area3
#1 species1     1     0     0
#2 species2     0     1     1
#3 species3     0     1     1

data

df1 <- structure(list(species = c("species1", "species2", "species3"
), regions = c("area1", "area2,area3", "area2,area3")), 
class = "data.frame", row.names = c(NA, 
 -3L))
0 голосов
/ 15 мая 2019
Подход

A dplyr / tidyr заключается в том, чтобы сначала разделить species на разные строки, group_by species и создать идентификатор строки для каждой группы, а затем spread - в широком формате, и посколькуЕсли требуется только информация об отсутствии присутствия (1/0), мы можем изменить любое число больше 1 на 1.

library(dplyr)
library(tidyr)

df %>%
  separate_rows(regions, sep = ",") %>%
  group_by(species) %>%
  mutate(row= row_number()) %>%
  spread(regions, row, fill = 0) %>%
  mutate_at(vars(starts_with("area")), ~replace(., . > 1, 1))

#  species  area1 area2 area3
#  <fct>    <dbl> <dbl> <dbl>
#1 species1     1     0     0
#2 species2     0     1     1
#3 species3     0     1     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...