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

R语言:按模式拆分矩阵行列名并判断标签是否存在交集

需求说明
  • 目标:判断矩阵行名、列名按指定规则拆分后是否存在公共元素,存在则对应矩阵位置记1,不存在记0
  • 前置规则:开展匹配统计前,需要先按指定分隔符拆分所有行列标签
  • 现存问题:自行编写的自定义函数搭配outer()调用无法得到正确结果,已给出预期输出示例,需要可运行的正确实现方案
问题复现

原有错误实现代码如下:

#ad hoc function
count_intersect <- function(x,y,symbol){
  require(stringr)
  x <- strsplit(x = x,split = symbol, perl = T)
  y <- strsplit(x = y,split = symbol, perl = T)
  result <- ifelse(length(intersect(x,y)),1,0)
  return(result)
}

rows <- c("a b","a c","a")
cols <- c("a","a c","d")

#my attempt
outer(rows, cols, count_intersect(""))

预期输出矩阵:

a a c d
a b 1   1 0
a c 1   1 0
a   1   1 0

原有代码核心问题:

  • outer()要求传入的函数支持向量化遍历,原函数未做适配,且调用时传参格式错误
  • 分隔符参数传值错误,示例中标签按空格拆分,原代码传入空字符串""
  • strsplit()返回结果为列表结构,原代码直接对两个列表取交集,逻辑不符合预期
正确实现代码
# 加载依赖包
require(stringr)

# 修正后的交集判断函数
count_intersect <- function(x, y, split_symbol = " ") {
  x_split <- strsplit(x, split = split_symbol, perl = TRUE)
  y_split <- strsplit(y, split = split_symbol, perl = TRUE)
  # 逐对判断交集是否存在
  mapply(function(x_item, y_item) {
    as.integer(length(intersect(x_item, y_item)) > 0)
  }, x_split, y_split)
}

# 输入行列标签
rows <- c("a b","a c","a")
cols <- c("a","a c","d")

# 调用outer生成结果矩阵,用Vectorize适配函数遍历逻辑
result <- outer(
  X = rows,
  Y = cols,
  FUN = Vectorize(function(row_name, col_name) {
    count_intersect(row_name, col_name, split_symbol = " ")
  })
)

# 给结果设置行名、列名
rownames(result) <- rows
colnames(result) <- cols

运行后输出的result和预期完全一致:

a a c d
a b 1   1 0
a c 1   1 0
a   1   1 0

如果需要更换拆分符号,只需要修改count_intersect调用时的split_symbol参数即可,比如按逗号拆分就传split_symbol = ","。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:36:43