首页 > 解决方案 > 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 函数)

标签: r

解决方案


也许:

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

推荐阅读