如何用grep/grepl识别变量并区分log与log+1类型?
问题修正方案
核心问题分析
你的代码有两个关键问题:
- 正则表达式错误:原代码中
grepl("log\\(\\+1\\)",fn_form)只能匹配log(+1)这种格式,但实际生成的字符串是log(txn_amt+1),导致第二个if条件永远无法触发,fnform永远不会被设为"log+1"。 - 判断顺序不合理:即使正则正确,先检测通用的
log模式会覆盖更具体的log+1模式判断逻辑。
修正方案1:判断整体向量的类型
如果需要根据fn_form整体包含的变量类型,给fnform赋值对应标签:
dep <- c("txn_amt", "txn_cnt", "acct_cnt") fn_form = c(dep, paste("log(",dep,"+1)",sep=""),paste("log(",dep,")",sep="")) fnform <- "count" # 优先检查是否存在log(x+1)类型,正则匹配log(xxx+1)格式 if(any(grepl("log\\([^)]+\\+1\\)", fn_form))) { fnform <- "log+1" } else if(any(grepl("log\\(", fn_form))) { # 无log(x+1)但存在log(x)类型 fnform <- "log" } # 输出结果:此时fn_form包含log+1类型,所以fnform为"log+1" fnform
修正方案2:为每个元素标记对应类型
如果需要给fn_form中的每个变量单独标记类型:
dep <- c("txn_amt", "txn_cnt", "acct_cnt") fn_form = c(dep, paste("log(",dep,"+1)",sep=""),paste("log(",dep,")",sep="")) # 初始化类型向量,默认标记为count fn_types <- rep("count", length(fn_form)) # 标记log(x+1)类型的元素 log_plus1_idx <- grepl("log\\([^)]+\\+1\\)", fn_form) fn_types[log_plus1_idx] <- "log+1" # 标记log(x)类型的元素(排除已标记为log+1的元素) log_idx <- grepl("log\\(", fn_form) & !log_plus1_idx fn_types[log_idx] <- "log" # 输出结果:每个元素对应正确类型 fn_types
关键修正说明
- 正则表达式调整:用
log\\([^)]+\\+1\\)替代原正则,其中[^)]+匹配变量名部分,能准确识别log(txn_amt+1)这类字符串。 - 判断逻辑优化:优先检查更具体的
log+1模式,再检查通用的log模式,避免逻辑覆盖。
内容的提问来源于stack exchange,提问作者Fredie Didier
相关产品推荐
相关产品推荐

