如何将多元丰度矩阵转换为R中的出现表?
我有一个多元丰度矩阵(按地点划分的物种丰度): 我需要使用这个矩阵并创建一个新的表/矩阵。新表应该有4列,具体来说,种类、长度、纬度和存在。对于这个表,我不关心丰度值,而是关心某个位置是否存在特定物种。因此,新的表格将在不同的位置有单一物种的多个副本,在这些位置存在和不存在。这张桌子应该是这样的。仅Sp_A示例:如何将多元丰度矩阵转换为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 #
## 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)