如何将多元丰度矩阵转换为R中的出现表?

如何将多元丰度矩阵转换为R中的出现表?,r,matrix,tidyverse,data-manipulation,R,Matrix,Tidyverse,Data Manipulation,我有一个多元丰度矩阵(按地点划分的物种丰度): 我需要使用这个矩阵并创建一个新的表/矩阵。新表应该有4列,具体来说,种类、长度、纬度和存在。对于这个表,我不关心丰度值,而是关心某个位置是否存在特定物种。因此,新的表格将在不同的位置有单一物种的多个副本,在这些位置存在和不存在。这张桌子应该是这样的。仅Sp_A示例: ## Species Long Lat Presence ## 1 Sp_A 30.01565 -29.71932 0 #

我有一个多元丰度矩阵(按地点划分的物种丰度):

我需要使用这个矩阵并创建一个新的表/矩阵。新表应该有4列,具体来说,种类、长度、纬度和存在。对于这个表,我不关心丰度值,而是关心某个位置是否存在特定物种。因此,新的表格将在不同的位置有单一物种的多个副本,在这些位置存在和不存在。这张桌子应该是这样的。仅Sp_A示例:

##    Species   Long        Lat         Presence
## 1  Sp_A      30.01565    -29.71932   0 #Binary meaning absent
## 2  Sp_A      29.99297    -29.69708   0
## 3  Sp_A      29.98867    -29.70216   1 #Binary meaning present
## 4  Sp_A      29.95418    -29.65436   1
## 5  Sp_A      29.96438    -29.66999   0
## 6  Sp_A      29.93963    -29.66700   1
换句话说,对于多元丰度矩阵中的每一个物种,我想为每一次观测创建单独的记录。如何使用函数在R中自动化此过程?我的数据格式化技能已经很不熟练了。任何建议都将不胜感激。

也许是这样

library(dplyr)
library(tidyr)

data %>%
  select(-Site) %>%
  pivot_longer(cols = starts_with('Sp'), values_to = 'Presence') %>%
  mutate(Presence = pmin(Presence, 1)) %>%
  arrange(name)

#    Long   Lat name  Presence
#   <dbl> <dbl> <chr>    <dbl>
# 1  30.0 -29.7 Sp_A         0
# 2  30.0 -29.7 Sp_A         0
# 3  30.0 -29.7 Sp_A         1
# 4  30.0 -29.7 Sp_A         1
# 5  30.0 -29.7 Sp_A         0
# 6  29.9 -29.7 Sp_A         1
# 7  30.0 -29.7 Sp_B         1
# 8  30.0 -29.7 Sp_B         1
# 9  30.0 -29.7 Sp_B         1
#10  30.0 -29.7 Sp_B         0
# … with 14 more rows
库(dplyr)
图书馆(tidyr)
数据%>%
选择(-Site)%>%
pivot_longer(cols=以('Sp')开始,值_to='Presence')%>%
突变(存在=pmin(存在,1))%>%
安排(姓名)
#长Lat名称存在
#         
#130.0-29.7 Sp_A 0
#230.0-29.7 Sp_A 0
#3 30.0-29.7 Sp_A 1
#430.0-29.7 Sp_A 1
#530.0-29.7 Sp_A 0
#6 29.9-29.7 Sp_A 1
#7 30.0-29.7 Sp_B 1
#830.0-29.7 Sp_B 1
#9 30.0-29.7 Sp_B 1
#10 30.0-29.7 Sp_B 0
#…还有14行
数据

data<-data.frame(Site,Long,Lat,Sp_A,Sp_B,Sp_C,Sp_D)
data <- type.convert(data)

data为什么您的值以字符串/字符的形式存储在矩阵中?感谢您的快速响应。在上面的示例数据集中,我的物种名称过于简单。每个物种名称都以不同的字母开头,因此
cols=以('Sp')开头将不起作用。那么您如何知道哪些列包含物种信息?您还可以使用列号作为
cols=3:6
。矩阵的前3列包含位置和ID数据,矩阵的其余部分是物种信息。
cols=3:6
应该可以工作。让我试试。您也可以使用
cols=-(1:2)
忽略前两列。(我已经用
select
删除了
Species
列)。我加载的其他一些库与
select
冲突。但是,您的解决方案非常有效。非常感谢罗纳克:)
library(dplyr)
library(tidyr)

data %>%
  select(-Site) %>%
  pivot_longer(cols = starts_with('Sp'), values_to = 'Presence') %>%
  mutate(Presence = pmin(Presence, 1)) %>%
  arrange(name)

#    Long   Lat name  Presence
#   <dbl> <dbl> <chr>    <dbl>
# 1  30.0 -29.7 Sp_A         0
# 2  30.0 -29.7 Sp_A         0
# 3  30.0 -29.7 Sp_A         1
# 4  30.0 -29.7 Sp_A         1
# 5  30.0 -29.7 Sp_A         0
# 6  29.9 -29.7 Sp_A         1
# 7  30.0 -29.7 Sp_B         1
# 8  30.0 -29.7 Sp_B         1
# 9  30.0 -29.7 Sp_B         1
#10  30.0 -29.7 Sp_B         0
# … with 14 more rows
data<-data.frame(Site,Long,Lat,Sp_A,Sp_B,Sp_C,Sp_D)
data <- type.convert(data)