在R中从字符串的开头和结尾剥离选择字符

anauzrmj  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(128)

如果有人回答了这个问题,我很抱歉,但我似乎找不到一个能解决这个问题的答案。下面是我使用的数据的一个小样本:

precinct_no,newsom_count,dahle_count,difference
0001-100000-SAN PASQUAL,5,18,-13
0002-100090-SAN PASQUAL,567,622,-55
0003-100120-SAN PASQUAL,0,0,0
0004-100150-SAN PASQUAL,0,0,0
0005-105000-RANCHO BERNARDO,572,538,34
0006-105040-RANCHO BERNARDO,609,582,27

在precinct_no列中,如何删除除中间六位数字之外的所有内容?我不需要开头的四位数字、结尾的城镇名称或破折号。只需要中间六位数字。我需要对大约3,000行执行此操作。

e37o9pze

e37o9pze1#

如果格式在大约3000行中是一致的,也许这会起作用:

df <- read.table(text = "precinct_no,newsom_count,dahle_count,difference
0001-100000-SAN PASQUAL,5,18,-13
0002-100090-SAN PASQUAL,567,622,-55
0003-100120-SAN PASQUAL,0,0,0
0004-100150-SAN PASQUAL,0,0,0
0005-105000-RANCHO BERNARDO,572,538,34
0006-105040-RANCHO BERNARDO,609,582,27",
header = TRUE, sep = ",")

df$precinct_no = gsub("[^-]*-(\\d{6})-.*", "\\1", df$precinct_no)
df
#>   precinct_no newsom_count dahle_count difference
#> 1      100000            5          18        -13
#> 2      100090          567         622        -55
#> 3      100120            0           0          0
#> 4      100150            0           0          0
#> 5      105000          572         538         34
#> 6      105040          609         582         27

创建于2022年11月30日,使用reprex v2.0.2
说明:
"[^-]*-(\\d{6})-.*"
[^-]*-匹配一个或多个非“-"字符,然后匹配单个“-”
(\\d{6})捕获此“中间”组(6位数)
-.*"匹配单个“-",后跟任意数量的任意字符

zhte4eai

zhte4eai2#

我喜欢extract这样的东西。你可以只从中间拉出来,也可以把所有东西分开来保存所有永久的信息:

library(tidyverse)

#get the middle
extract(df, 
        precinct_no, 
        into = "precinct_no", 
        regex = ".*-(.*)-.*",
        convert = TRUE)
#>   precinct_no newsom_count dahle_count difference
#> 1      100000            5          18        -13
#> 2      100090          567         622        -55
#> 3      100120            0           0          0
#> 4      100150            0           0          0
#> 5      105000          572         538         34
#> 6      105040          609         582         27

#get everything
extract(df, 
        precinct_no, 
        into = c("ID", "precinct_no", "town"), 
        regex = "(.*)-(.*)-(.*)",
        convert = TRUE)
#>   ID precinct_no            town newsom_count dahle_count difference
#> 1  1      100000     SAN PASQUAL            5          18        -13
#> 2  2      100090     SAN PASQUAL          567         622        -55
#> 3  3      100120     SAN PASQUAL            0           0          0
#> 4  4      100150     SAN PASQUAL            0           0          0
#> 5  5      105000 RANCHO BERNARDO          572         538         34
#> 6  6      105040 RANCHO BERNARDO          609         582         27

或者如果你不喜欢regex,只想在“-"上拆分:

library(tidyverse)

separate(df, 
         precinct_no , 
         into = c("ID", "precinct_no", "town"), 
         sep = "-", 
         convert = TRUE)
#>   ID precinct_no            town newsom_count dahle_count difference
#> 1  1      100000     SAN PASQUAL            5          18        -13
#> 2  2      100090     SAN PASQUAL          567         622        -55
#> 3  3      100120     SAN PASQUAL            0           0          0
#> 4  4      100150     SAN PASQUAL            0           0          0
#> 5  5      105000 RANCHO BERNARDO          572         538         34
#> 6  6      105040 RANCHO BERNARDO          609         582         27

或者,如果您不喜欢regex,而希望保留基数R:

df$precinct_no <- unlist(Map(\(x)x[2], strsplit(df$precinct_no, "-")))
df
#>   precinct_no newsom_count dahle_count difference
#> 1      100000            5          18        -13
#> 2      100090          567         622        -55
#> 3      100120            0           0          0
#> 4      100150            0           0          0
#> 5      105000          572         538         34
#> 6      105040          609         582         27

相关问题