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

如何用R高效生成值在各向量中存在性的标识表格

高效生成存在性标记数据表(R语言)

需求说明

给定以下R向量:

v1 <- c("a","x","y","z")
v2 <- c("b","g","m","r","s","x","z")
v3 <- c("a","m","x","y","z","b","r","g")
v4 <- c("d","h","a","g","s","x")

需要生成一个数据表:

  • 每行对应所有向量中的唯一值(列为ID)
  • 每列对应一个输入向量
  • 单元格值为1表示该行ID存在于对应向量中,0表示不存在

要求尽可能避免多次遍历向量,解决传统“先收集唯一ID再逐个检查”方法效率低下的问题。

高效实现方案

方案1:使用tidyverse工具链

利用tidyverse的管道操作和内置优化函数,仅需一次遍历即可完成:

library(tidyverse)

# 输入向量
v1 <- c("a","x","y","z")
v2 <- c("b","g","m","r","s","x","z")
v3 <- c("a","m","x","y","z","b","r","g")
v4 <- c("d","h","a","g","s","x")

# 将向量存入命名列表,方便后续处理
vec_list <- list(v1 = v1, v2 = v2, v3 = v3, v4 = v4)

# 生成目标数据表
result <- vec_list %>%
  enframe(name = "vector", value = "ID") %>%  # 将列表转为长格式数据框
  unnest(ID) %>%  # 展开向量元素
  mutate(exists = 1) %>%  # 标记存在性
  pivot_wider(
    names_from = vector, 
    values_from = exists, 
    values_fill = 0  # 不存在的位置填充0
  ) %>%
  arrange(ID)  # 按ID排序

print(result)

方案2:使用Base R原生函数

利用table函数的高效C语言实现,无需额外依赖包:

# 输入向量
v1 <- c("a","x","y","z")
v2 <- c("b","g","m","r","s","x","z")
v3 <- c("a","m","x","y","z","b","r","g")
v4 <- c("d","h","a","g","s","x")

# 将向量存入命名列表
vec_list <- list(v1 = v1, v2 = v2, v3 = v3, v4 = v4)

# 堆叠向量并生成频次表
vec_stack <- stack(vec_list)
exist_table <- table(vec_stack$values, vec_stack$ind)

# 转换为目标数据框格式
result_base <- as.data.frame.matrix(exist_table)
result_base$ID <- rownames(result_base)
result_base <- result_base[, c("ID", names(vec_list))]
rownames(result_base) <- NULL

print(result_base)

输出结果

两种方案均会输出符合要求的数据表:

ID v1 v2 v3 v4
1   a  1  0  1  1
2   b  0  1  1  0
3   d  0  0  0  1
4   g  0  1  1  1
5   h  0  0  0  1
6   m  0  1  1  0
7   r  0  1  1  0
8   s  0  1  0  1
9   x  1  1  1  1
10  y  1  0  1  0
11  z  1  1  1  0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:35:45