在R中从不等长向量生成0-1存在性矩阵
生成0-1存在性矩阵的R语言解决方案
我是R语言新手,现在有多个不等长的字符串向量(最多20个,每个最多300个值),想要生成一个0-1存在性矩阵:所有向量的唯一值作为行名,向量名作为列名,值在对应向量中存在标1,不存在标0。已经合并向量得到唯一值列表ASVitems,但不知道怎么生成矩阵并标记存在性。
示例数据
v1 = c("ASV581", "ASV547", "ASV434", "ASV378", "ASV7", "ASV1478", "ASV676", "ASV361", "ASV142", "ASV92", "ASV16", "ASV2") v2 = c("ASV15", "ASV7", "ASV5", "ASV2", "ASV676", "ASV581", "ASV522", "ASV361") v3 = c("ASV1", "ASV7", "ASV3", "ASV15", "ASV2", "ASV38", "ASV28", "ASV22", "ASV5", "ASV346", "ASV208", "ASV139", "ASV13", "ASV919", "ASV676") v4 = c("ASV15", "ASV7", "ASV5", "ASV2", "ASV208", "ASV139", "ASV361", "ASV142")
已执行代码
x <- c(v1, v2, v3, v4) ASVitems <- unique(x)
期望输出示例
[v1] [v2] [v3] [v4] ASV2 1 1 1 1 ASV3 0 0 1 0 ASV5 0 1 1 0 ASV7 1 1 1 1 ...
解决方案
方法1:基础R原生实现(无需额外包)
- 先把所有向量存入列表,方便批量处理:
vec_list <- list(v1 = v1, v2 = v2, v3 = v3, v4 = v4)
- 批量检查每个唯一值在各向量中的存在性,生成0-1矩阵:
presence_matrix <- sapply(vec_list, function(vec) { as.integer(ASVitems %in% vec) }) # 设置行名为唯一值集合 rownames(presence_matrix) <- ASVitems
执行后用head(presence_matrix)即可查看前几行结果。
方法2:tidyverse包实现(更直观的 tidy 风格)
如果习惯数据整理的 tidy 语法,可以用这套方案:
- 先安装并加载包:
install.packages("tidyverse") library(tidyverse)
- 转换数据格式生成矩阵:
# 把向量列表转成长格式数据框 long_df <- vec_list %>% enframe(name = "vector_name", value = "ASV") %>% unnest(cols = c(ASV)) %>% mutate(present = 1) # 转成宽格式的0-1矩阵 presence_matrix_tidy <- long_df %>% pivot_wider(names_from = vector_name, values_from = present, values_fill = 0) %>% column_to_rownames(var = "ASV") %>% as.matrix()
这个方法的逻辑更贴近"从数据到矩阵"的直观转换过程,适合新手理解。
内容的提问来源于stack exchange,提问作者Angelica
相关产品推荐
相关产品推荐

