匹配并替换R中列中的字符

Match and replace character in column in R

我一直在处理以下问题,但似乎无法解决。请给我你的解决方法的建议。

假设我有以下数据框。

NAICS 2017  NAICS 2012_1    NAICS 2012_2    NAICS 2012_3    NAICS 2012_4
2100    2111    0   0   0
9110    9119    5114    0   0
1113    5676    4875    2186    1153
6220    6225    1293    0   0
1115    3234    2163    0   0
7110    7873    0   0   0
1100    2679    8153    2114    1145

如果 NAICS 2017 列存在于其他 4 个 NAICS 列中,我想用匹配的 2 位数 NAICS 替换它。

因此代码将确定是否有 2 位数字匹配(2100 匹配 2111),然后将 2 位代码替换为四位代码。 (2110 变为 2111)。

这是最终代码的样子。

NAICS 2017  NAICS 2012_1    NAICS 2012_2    NAICS 2012_3    NAICS 2012_4
2111    2111    0   0   0
9119    9119    5114    0   0
1153    5676    4875    2186    1153
6225    6225    1293    0   0
1115    3234    2163    0   0
7110    7873    0   0   0
1145    2679    8153    2114    1145

可选添加:如果 NAICS 2017 列是 2 位或 3 位代码(即 2100 或 2110),则仅更改 NAICS 代码。

这可以用 grepl 或 gsub 代码完成吗?

如果您想要完整的数据集,请随时询问。

试试这个,update 列是结果:

library(dplyr)

it <- data.table::fread(
"    NAICS_2017 NAICS 2012_1    NAICS 2012_2    NAICS 2012_3    NAICS 2012_4
    2100    2111    0   0   0
    9110    9119    5114    0   0
    1113    5676    4875    2186    1153
    6220    6225    1293    0   0
    1115    3234    2163    0   0
    7110    7873    0   0   0
    1100    2679    8153    2114    1145"
)

it <- mutate_all(it, as.character)

matchit <- function(x){
  tmp <- x[-1]
  mypattern = paste0("^",stringr::str_sub(x[[1]],1,2),".*$")
  hit <- tmp[which(grepl(mypattern, tmp))]

  return(ifelse(length(hit), hit[[1]], x[[1]]))
}

it$update <- apply(it, 1, matchit)
it
#>   NAICS_2017 NAICS 2012_1 NAICS 2012_2 NAICS 2012_3 NAICS 2012_4 update
#> 1       2100         2111            0            0            0   2111
#> 2       9110         9119         5114            0            0   9119
#> 3       1113         5676         4875         2186         1153   1153
#> 4       6220         6225         1293            0            0   6225
#> 5       1115         3234         2163            0            0   1115
#> 6       7110         7873            0            0            0   7110
#> 7       1100         2679         8153         2114         1145   1145

说明: 函数 returns 一行中模式的第一个匹配项(第一个元素除外),如果不是,则 returns 第一个元素, 然后我们可以通过将其应用于每一行来更新 data.frame。