如何在R语言dataframe中检测指定编码并生成二值变量
解决方案
你可以通过以下几种方式实现需求,核心是逐行检查所有目标列中是否存在指定编码,并将结果转换为二值变量:
1. 先定义目标编码列表
target_codes <- c("1-A400", "1-A401", "1-A402", "1-A410", "1-A415", "1-A4152", "1-A4158", "1-B377", "1-P360", "1-P362", "1-P364", "1-U900")
2. 场景一:每个单元格仅存储单个编码
这种情况直接用元素匹配即可,不需要字符串检测:
Base R 实现
# 逐行检查c1到c100列,判断是否有编码在目标列表中,转换为0/1 fy14y$has_match <- as.integer(apply(fy14y[, paste0("c", 1:100)], 1, function(row) { any(row %in% target_codes, na.rm = TRUE) }))
dplyr 实现(更符合tidyverse风格)
library(dplyr) fy14y <- fy14y %>% rowwise() %>% mutate(has_match = as.integer(any(c_across(c1:c100) %in% target_codes, na.rm = TRUE))) %>% ungroup()
na.rm = TRUE 用于忽略单元格中的NA值,避免匹配结果被NA干扰。
3. 场景二:单元格可能包含多个编码(如用分隔符分隔)
如果单元格内有多个编码(比如1-A400,2-Y0408),需要用精确字符串匹配避免误判(比如防止把1-A415匹配到1-A4152):
先构建精确匹配的正则模式
library(stringr) # 构建正则:匹配编码作为独立项存在(假设用逗号分隔,其他分隔符可替换",") pattern <- paste0( "(^|,)", paste(target_codes, collapse = "($|,)|(^|,)"), "($|,)" )
应用到数据框
# Base R 方式 fy14y$has_match <- as.integer(apply(fy14y[, paste0("c", 1:100)], 1, function(row) { any(str_detect(row, pattern), na.rm = TRUE) })) # dplyr 方式 fy14y <- fy14y %>% rowwise() %>% mutate(has_match = as.integer(any(str_detect(c_across(c1:c100), pattern), na.rm = TRUE))) %>% ungroup()
为什么之前str_detect效果不佳?
大概率是两个原因:
- 没有跨行检查所有c1-c100列,只单独检查了某一列;
- 未使用精确匹配规则,导致部分匹配错误(比如
1-A415被误匹配到包含1-A4152的单元格)。
内容的提问来源于stack exchange,提问作者Lukasz_S
相关产品推荐
相关产品推荐

