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

匹配两个数据框列:仅当test.data的wascname为NA时替换该列值

解决方案:仅替换test.data中wascname为NA的匹配值

我来帮你搞定这个问题!核心需求很明确:咱们只在test.data的wascname列是NA的时候,从wascNames里匹配对应的条目来填充,绝对不能覆盖已经有值的行。下面是具体的实现步骤和代码:

第一步:先明确示例数据

先把你给出的示例数据整理好,方便后续操作:

# 你的测试数据框
test.data <- data.frame(
  summary = c(
    "通过Tooltalk数据库服务器(rpc.ttdbserverd)的缓冲区溢出以root权限执行命令。",
    "通过PKCS #1获取SSL加密会话中的信息。",
    "BSD衍生的TCP/IP实现中的ip_input.c允许远程攻击者通过特制数据包导致拒绝服务(崩溃或挂起)。"
  ),
  wascname = c(NA, NA, "Improper Input Handling"),
  stringsAsFactors = FALSE
)

# 包含wasc名称的参考数据框(我补充了几个可能匹配的条目)
wascNames <- data.frame(
  wascname = c("Abuse of Functionality", "Brute Force", "Buffer Overflow", "Information Exposure", "Improper Input Handling"),
  stringsAsFactors = FALSE
)

第二步:基础实现(精准关键词匹配)

如果你的summary里有明确的关键词可以对应wascNames里的名称,用base R或者stringr包就能轻松搞定:

# 加载stringr包(用来做字符串匹配,也可以用base R的grepl)
library(stringr)

# 定义关键词和对应wascname的匹配规则,你可以根据实际需求扩展这个列表
match_map <- list(
  "缓冲区溢出" = "Buffer Overflow",
  "获取SSL加密会话中的信息" = "Information Exposure"
)

# 遍历每个匹配规则,只替换NA的行
for (key in names(match_map)) {
  # 找到:summary包含关键词 且 wascname是NA 的行
  target_indices <- str_detect(test.data$summary, key) & is.na(test.data$wascname)
  # 替换这些行的wascname
  test.data$wascname[target_indices] <- match_map[[key]]
}

# 看看结果
print(test.data)

运行后你会发现,原来的两个NA值被正确替换,而第三行的已有值完全保留。

第三步:进阶实现(模糊匹配/复杂逻辑)

如果你的匹配逻辑更复杂(比如需要模糊匹配多个关键词,或者参考数据框的名称和summary的描述不是直接对应),可以用fuzzyjoin包来做模糊连接:

# 加载需要的包
library(fuzzyjoin)
library(stringr)

# 先筛选出test.data中wascname为NA的行,和wascNames做模糊连接
matched_rows <- fuzzy_inner_join(
  test.data[is.na(test.data$wascname), ],  # 只处理NA的行
  wascNames,
  by = c("summary" = "wascname"),
  # 自定义匹配逻辑:这里示例是把wascname转成对应中文关键词,检查summary是否包含
  match_fun = function(summary_text, wasc_name) {
    wasc_cn <- case_when(
      wasc_name == "Buffer Overflow" ~ "缓冲区溢出",
      wasc_name == "Information Exposure" ~ "信息泄露",
      TRUE ~ ""
    )
    str_detect(summary_text, wasc_cn)
  }
)

# 把匹配到的wascname填充回原数据框
test.data$wascname[is.na(test.data$wascname)] <- matched_rows$wascname.y

# 查看最终结果
print(test.data)

关键注意点

  • 全程只针对is.na(test.data$wascname)的行操作,绝对不会覆盖已经有值的条目
  • 匹配规则可以根据你的实际数据灵活调整,不管是精准匹配还是模糊匹配,核心逻辑都是先筛选NA行,再替换

内容的提问来源于stack exchange,提问作者Kill3rbee Lee Mtoti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:37:07