将物种区域出现转换为存在/不在场矩阵

时间:2019-05-14 23:13:10

标签: r matrix

我有一个数据框,其中第一列是物种名称,第二列是物种生活的地方,按区域进行编码。我想将此数据帧转换为存在/不存在矩阵,其中行是物种名称,列是面积,每个记录(跟随标题)是一系列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 :(得分:0)

一种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

答案 1 :(得分:0)

我们可以通过base R轻松地做到这一点,方法是将“区域”列除以,,将list元素的名称设置为“ species”,将{{1} }使用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