r - 如何将我的列数据转换为社区矩阵
问题描述
我有两列的数据,社区编号和物种
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
提前致谢!
解决方案
我建议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
推荐阅读
- python - 如何避免在我的 Python 脚本中使用路径名?
- python - Python中的自动字符串合并
- neo4j - 一台服务器/集群上的 Neo4j 多个图
- python - 如何将scrapy loader处理器用于长功能?
- ms-access - 基于索引号和其他条件的 MS Access 更新查询
- elasticsearch - ElasticSearch 根据字段值的计数提高相关性
- android - 有错误的基本 android studio 项目
- intellij-idea - Kotlin println 特殊字符
- java - 休眠。延迟加载。最佳实践。怎么了?
- python - Django 错误“包含的 URLconf 中似乎没有任何模式”