通过物种矩阵将物种基质折叠到现场

时间:2017-06-30 00:58:40

标签: r

提前道歉,我很难说出这个问题。我有一个物种相互作用矩阵,其中列和行代表物种,矩阵填充是它们相互作用的频率:

matrix<-   2A   2B   2C   
         1A 1   2    4      
         1B 0   1    1    
         1C 5   4    1    

我想用以下形式制作一个矩阵:

 mat<-        
            comm
     1A_2A   1
     1A_2B   2
     1A_2C   4
     1B_2A   0
     1B_2B   1
     1B_2C   1
     1C_2A   5
     1C_2B   4
     1C_2C   1

物种相互作用成为行,列可以是任何变量,但矩阵填充仍然是相互作用的频率,结构仍然是一个矩阵。这样,矩阵采用社区x物种矩阵的形式。我想以这种方式折叠矩阵并保留矩阵形式的原因是为了能够使用library(vegetarian)中的函数,例如需要矩阵形式的d()

2 个答案:

答案 0 :(得分:1)

使用:

m2 <- matrix(t(m1))
dimnames(m2) <- list(paste(rep(rownames(m1), each = nrow(m1)),
                           colnames(m1), sep = '_'),
                     'comm')

给出:

> m2
      comm
1A_2A    1
1A_2B    2
1A_2C    4
1B_2A    0
1B_2B    1
1B_2C    1
1C_2A    5
1C_2B    4
1C_2C    1

这是做什么的:

  • 您可以将矩阵视为二维向量。要获得矢量,您只需使用c(m1)即可。这将给出一个向量,其中第一列的值首先是第一列的值,然后是第二列的值,依此类推。要以行方式获取值,您可以使用t(m1)转换矩阵。
  • 通过将其包装在matrix中,您将获得一列矩阵,这是未指定列数或行数时的默认行为。因此,matrix(t(m1))matrix(t(m1), ncol = 1)相同。
  • 最后,您创建一个长度为2的列表,其中包含rownames(paste(rep(rownames(m1), each = nrow(m1)), colnames(m1), sep = '_')和columnnames('comm)并将其分配给dimnames。新的rownames是通过重复每个rowname {来创建的。 {1}}与m1中的列数一样多次,并使用列名称的向量粘贴(将被回收)。

如果您希望按列顺序排列值,则可以将上述代码调整为:

m1

给出相同的结果,但顺序不同:

m2 <- matrix(m1)
dimnames(m2) <- list(paste(rownames(m1),
                           rep(colnames(m1), each = ncol(m1)), sep = '_'),
                     'comm')

或者您也可以使用> m2 comm 1A_2A 1 1B_2A 0 1C_2A 5 1A_2B 2 1B_2B 1 1C_2B 4 1A_2C 4 1B_2C 1 1C_2C 1 - 包:

reshape2

返回一个数据帧:

library(reshape2)
d1 <- melt(m1)
rownames(d1) <- paste(d1$Var1, d1$Var2, sep = '_')
d1 <- d1[, 3, drop = FALSE]

要获取矩阵,您只需将> d1 value 1A_2A 1 1B_2A 0 1C_2A 5 1A_2B 2 1B_2B 1 1C_2B 4 1A_2C 4 1B_2C 1 1C_2C 1 包裹在d1as.matrix中。

使用过的数据:

as.matrix(d1)

答案 1 :(得分:-2)

使用dplyr / tidyverse:

library(tidyverse)

df <-   read.table(textConnection("2A   2B   2C   
         1A 1   2    4      
         1B 0   1    1    
         1C 5   4    1"), check.names=F)

new_df <- df %>% rownames_to_column("Species_1") %>% gather(key="Species_2", value="Interactions", -Species_1)


Species_1 Species_2 Interactions
1        1A        2A            1
2        1B        2A            0
3        1C        2A            5
4        1A        2B            2
5        1B        2B            1
6        1C        2B            4
7        1A        2C            4
8        1B        2C            1
9        1C        2C            1