r - R查找以一组数字字符开头的行
问题描述
我正在尝试使用前两个前缀修复邮政编码输入错误。作为一个可重现的示例,(假设)假设邮政编码以 01、02、03 和 04 开头是 MA,但我的数据包含如下错误。
ma_zip <- c("01", "02", "03", "04")
df <- data.frame(zip = c("01100", "02223", "04332", "03234"),
state = c("MA", "NJ", "NY", "NY")) %>%
mutate(zip = as.character(zip),
state = as.character(state))
我尝试通过以下两种方式修复错误。在第一种(也是蛮力)方法中,我一个一个地修复它并得到我想要的结果。
df_cleaned1 <- df %>%
mutate(state = replace(state, startsWith(zip, "02"), "MA"),
state = replace(state, startsWith(zip, "03"), "MA"),
state = replace(state, startsWith(zip, "04"), "MA"))
> df_cleaned1
zip state
1 01100 MA
2 02223 MA
3 04332 MA
4 03234 MA
但这并不是最有趣的事情,因为我必须反复复制和粘贴。所以我尝试了以下方法,但这似乎不起作用(也没有抛出错误消息)。
df_cleaned2 <- df %>%
mutate(state = replace(state, startsWith(zip, paste(ma_zip, collapse="|")), "MA"))
> df_cleaned2
zip state
1 01100 MA
2 02223 NJ
3 04332 NY
4 03234 NY
有没有一种有效的生产方式,df_cleaned1
同时避免蛮力方法?(不必使用 startWith 函数)
解决方案
也许:
library(dplyr)
df %>% mutate(state = replace(state, substr(zip, 1, 2) %in% ma_zip, 'MA'))
输出:
zip state
1 01100 MA
2 02223 MA
3 04332 MA
4 03234 MA
推荐阅读
- javascript - 使用 POST 方法提交后立即更新 CRM 中的潜在客户
- selenium - Python - 如何使用已经激活的 chrome 浏览器来暂停/恢复/跳过 youtube 视频
- python - 文字和别名 bigquery 之间缺少空格
- sql - 在 SQL Big Query 中的类别中查找重叠
- neo4j - neo4j 是如何进行 MATCH 的?
- azure-functions - Azure服务总线触发函数:判断当前尝试是否为最后一次
- android-studio - 如何将文本和图像与自定义位置对齐?
- javascript - 打字稿条件函数签名 - 基于选项中的布尔值
- c# - 配置 Seq 以自动发送电子邮件的示例
- angular - Angular - 如何从祖父组件访问子组件?