匹配并替换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。
我一直在处理以下问题,但似乎无法解决。请给我你的解决方法的建议。
假设我有以下数据框。
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。