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