如何用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
相关产品推荐
相关产品推荐

