提前道歉,我很难说出这个问题。我有一个物种相互作用矩阵,其中列和行代表物种,矩阵填充是它们相互作用的频率:
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()
。
答案 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)
相同。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
包裹在d1
:as.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