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

R/tidyverse提取指定编码在字符串中位置并新增列的实现方法

实现方案

我们可以通过两种方式实现需求,分别是依赖tidyverse生态的简洁版本和无需额外安装包的基础R版本:

方案1:tidyverse简洁实现

# 未安装依赖先执行 install.packages(c("stringr", "purrr"))
library(stringr)
library(purrr)

# 1. 把每行multi_codes按空格拆分为编码向量,过滤空字符串
code_list <- str_split(database$multi_codes, "\\s+")
code_list <- map(code_list, ~.x[.x != ""])

# 2. 批量生成39个匹配结果列
new_cols <- map_dfc(pattern$single_codes, function(target_code) {
  # 逐行匹配目标编码的位置
  pos_list <- map(code_list, ~which(.x == target_code))
  # 无匹配返回NA,有匹配拼接为逗号分隔的字符串
  col_vals <- map_chr(pos_list, ~if(length(.x) == 0) NA_character_ else paste(.x, collapse = ","))
  # 生成对应列名的字段
  tibble(!!target_code := col_vals)
})

# 3. 合并到原database数据框
database <- cbind(database, new_cols)

方案2:基础R实现(无需额外安装包)

for (target_code in pattern$single_codes) {
  database[[target_code]] <- sapply(strsplit(database$multi_codes, "\\s+"), function(codes) {
    codes <- codes[codes != ""]
    pos <- which(codes == target_code)
    ifelse(length(pos) == 0, NA_character_, paste(pos, collapse = ","))
  })
}

原代码问题说明

你之前的写法只取了拆分后结果的第一个元素[[1]],仅处理了第一行数据,同时没有把结果存入数据框的对应列,所以无法得到预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:24:06