匹配两个数据框列:仅当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
相关产品推荐
相关产品推荐

