You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将不等长向量列表转换为二进制数据框(R语言)

在R语言中将不等长向量列表转换为二进制数据框

这里提供三种实用方法来实现你的需求,以下代码均可直接基于你的示例数据运行:

方法一:基础R原生实现

无需额外安装包,适合轻量需求:

# 构造你的示例数据
gene_annot <- list(
  c("lipid binding", "catalytic activity", "hydrolase activity", "lipid metabolic process",
    "cytosol", "organelle", "mitochondrion", "signaling", "extracellular region", "extracellular space"),
  c("extracellular region", "extracellular space", "organelle"),
  c("extracellular region", "extracellular space"),
  logical(0),
  c("organelle", "nucleus", "nucleoplasm", "immune system process",
    "defense response to other organism", "protein folding")
)

# 提取所有唯一标注标签
all_terms <- unique(unlist(gene_annot))

# 生成二进制矩阵:遍历每个列表元素,检查标签是否存在
binary_matrix <- t(sapply(gene_annot, function(x) {
  as.integer(all_terms %in% x)
}))

# 转换为目标数据框
gene_annot_binary <- as.data.frame(binary_matrix)
colnames(gene_annot_binary) <- all_terms

方法二:tidyverse 工具链实现

适合已经在使用 tidyverse 生态的场景,代码更直观:

library(tidyverse)

gene_annot_binary <- tibble(
  row_id = seq_along(gene_annot),  # 给每行分配唯一ID
  terms = gene_annot
) %>%
  unnest_longer(terms, keep_empty = TRUE) %>%  # 拆分标签为行,保留空列表的行
  mutate(value = 1) %>%  # 标记存在的标签
  pivot_wider(
    names_from = terms,  # 标签作为列名
    values_from = value,
    values_fill = 0  # 不存在的标签填充0
  ) %>%
  select(-row_id)  # 移除辅助ID列

方法三:qdapTools 包快捷实现

用专门的函数一步到位,代码最简洁:

library(qdapTools)

# 直接生成二进制数据框
gene_annot_binary <- as.data.frame(mtabulate(gene_annot))

注:如果你的列表中存在重复标签,mtabulate会返回计数,可通过gene_annot_binary <- as.data.frame(ifelse(mtabulate(gene_annot) > 0, 1, 0))强制转为二进制。

内容的提问来源于stack exchange,提问作者monotonic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:06:15