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

