首页 > 解决方案 > 如何将我的列数据转换为社区矩阵

问题描述

我有两列的数据,社区编号和物种

com <- paste(c("1", "1", "1", "1", "2", "2", "3","3","3", "4", "4", "5", "5"))
species <- paste(c("sp1", "sp1", "sp2", "sp4", "sp3", "sp1", "sp5", "sp2","sp2", "sp3","sp3", "sp5", "sp1" ))
data <- as.data.frame(cbind(com, species))
data
   com species
    1     sp1
    1     sp1
    1     sp2
    1     sp4
    2     sp3
    2     sp1
    3     sp5
    3     sp2
    3     sp2
    4     sp3
    4     sp3
    5     sp5
    5     sp1 

我想要的是这样的社区矩阵:

  sp1 sp2 sp3 sp4 sp5
1  2   1   0   1   0
2  1   0   1   0   0   
3  0   2   0   0   1
4  0   0   0   2   0
5  1   0   0   0   5

提前致谢!

标签: rmatrixformatting

解决方案


我建议tidyverse采用这样的方法来重塑您的数据:

library(tidyverse)

#Data
com <- paste(c("1", "1", "1", "1", "2", "2", "3","3","3", "4", "4", "5", "5"))
species <- paste(c("sp1", "sp1", "sp2", "sp4", "sp3", "sp1", "sp5", "sp2","sp2", "sp3","sp3", "sp5", "sp1" ))
data <- as.data.frame(cbind(com, species))

#Reshape
data %>% pivot_longer(cols = -com) %>%
  group_by(com,value) %>% summarise(N=n()) %>%
  pivot_wider(names_from = value, values_from=N) %>%
  replace(is.na(.),0)

输出:

# A tibble: 5 x 6
# Groups:   com [5]
  com     sp1   sp2   sp4   sp3   sp5
  <fct> <int> <int> <int> <int> <int>
1 1         2     1     1     0     0
2 2         1     0     0     1     0
3 3         0     2     0     0     1
4 4         0     0     0     2     0
5 5         1     0     0     0     1

如果您想进一步正确排列所有名称,可以使用下一个代码:

data %>% pivot_longer(cols = -com) %>%
  arrange(value) %>%
  # mutate(value = factor(value,levels = sort(unique(value)),ordered = T)) %>%
  group_by(com,value) %>% summarise(N=n()) %>%
  pivot_wider(names_from = value, values_from=N) %>%
  replace(is.na(.),0) %>%
  select(sort(current_vars()))

输出:

# A tibble: 5 x 6
# Groups:   com [5]
  com     sp1   sp2   sp3   sp4   sp5
  <fct> <int> <int> <int> <int> <int>
1 1         2     1     0     1     0
2 2         1     0     1     0     0
3 3         0     2     0     0     1
4 4         0     0     2     0     0
5 5         1     0     0     0     1

推荐阅读