我一直在研究以下问题,但似乎无法解决。请给我您的解决建议。
假设我有以下数据框。
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代码完成吗?
如果您想要完整的数据集,请随时询问。
答案 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应用于每一行来更新它。