在R语言中将197个地点水平转换为二水平变量的报错问题
解决grepl创建INSIDE变量的错误问题
嘿,我发现你代码里的核心问题啦:grepl()函数的pattern参数不支持直接传入字符串向量,它需要的是单个正则表达式字符串。你原来的写法会因为向量长度不匹配或者匹配逻辑不符合预期而报错,下面给你修正方案:
正确实现步骤
- 先把所有代表内部场景的关键词整理成一个向量,然后用
paste()函数把它们合并成用|分隔的正则表达式(|在正则里表示“或”的意思) - 用合并后的正则表达式传入
grepl(),还可以加上ignore.case=TRUE参数,避免因为大小写不一致漏匹配(比如数据里的"building"小写就匹配不到你原来的大写关键词) - 直接把
grepl()返回的逻辑值转成整数(因为TRUE对应1,FALSE对应0),或者用ifelse()包裹也可以
修正后的代码
# 定义内部场景关键词向量 inside_terms <- c("BUILDING", "ROOM", "AUTO", "BALCONY", "BANK", "BAR", "STORE", "CHURCH", "COLLEGE", "CONDOMINIUM", "CENTER", "DAY CARE", "SCHOOL", "HOSPITAL", "LIBRARY", "PARLOR", "OFFICE", "MOSQUE", "CLUB", "PORCH", "MALL", "WAREHOUSE") # 合并成正则表达式 inside_pattern <- paste(inside_terms, collapse = "|") # 创建INSIDE变量(两种写法任选其一) # 写法1:直接转整数 data$INSIDE <- as.integer(grepl(inside_pattern, data$Premise.Description, ignore.case = TRUE)) # 写法2:用ifelse(和你原来的逻辑一致) data$INSIDE <- ifelse(grepl(inside_pattern, data$Premise.Description, ignore.case = TRUE), 1, 0)
为什么原代码会出错?
当你给grepl()的pattern传向量时,R会尝试循环匹配每个pattern元素和对应的x元素(也就是data$Premise.Description的每一行),如果两者长度不一致,就会触发循环规则,但这完全不是你想要的“只要匹配任意一个关键词就算内部场景”的逻辑,所以必然会报错或者得到错误的结果。
内容的提问来源于stack exchange,提问作者Prashanth Cp
相关产品推荐
相关产品推荐

