匹配并替换R列中的字符

时间:2018-08-17 01:35:39

标签: r replace string-matching grepl

我一直在研究以下问题,但似乎无法解决。请给我您的解决建议。

假设我有以下数据框。

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

如果其他4个NAICS列中都存在匹配的2位数NAICS,我想本质上将其替换为NAICS 2017列。

因此,代码将确定是否存在2位数字匹配项(2100与2111匹配项),然后将2位数字代码替换为4位数字代码。 (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代码完成吗?

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

1 个答案:

答案 0 :(得分:0)

尝试一下,结果是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

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