繁体   English   中英

如何在r中的第n个字符之后拆分字符串

[英]How to split a string after the nth character in r

我正在处理以下数据:

District <- c("AR01", "AZ03", "AZ05", "AZ08", "CA01", "CA05", "CA11", "CA16", "CA18", "CA21")

我想在第二个字符之后拆分字符串并将它们分成两列。

使数据看起来像这样:

state  district
AR        01
AZ        03
AZ        05
AZ        08
CA        01
CA        05
CA        11
CA        16
CA        18
CA        21

有没有简单的代码来完成这项工作? 非常感谢你的帮助

如果您总是想按第二个字符拆分,则可以使用substr

District <- c("AR01", "AZ03", "AZ05", "AZ08", "CA01", "CA05", "CA11", "CA16", "CA18", "CA21")
#split district  starting at the first and ending at the second
state <- substr(District,1,2)
#split district starting at the 3rd and ending at the 4th
district <- substr(District,3,4)
#put in data frame if needed.
st_dt <- data.frame(state = state, district = district, stringsAsFactors = FALSE)

你可以使用基础 R 中的strcapture

 strcapture("(\\w{2})(\\w{2})",District,
                    data.frame(state = character(),District = character()))
   state District
1     AR       01
2     AZ       03
3     AZ       05
4     AZ       08
5     CA       01
6     CA       05
7     CA       11
8     CA       16
9     CA       18
10    CA       21

其中\\\\w{2}表示两个词

OP已经写了

我更熟悉strsplit() 但是由于没有什么可拆分的,因此在这种情况下不适用

反之! 有一些东西可以拆分,它被称为lookbehind

strsplit(District, "(?<=[A-Z]{2})", perl = TRUE) 

后视的工作方式类似于“在 2 个大写字母后插入一个不可见的中断”并在那里拆分字符串。

结果是一个向量列表

[[1]] [1] "AR" "01" [[2]] [1] "AZ" "03" [[3]] [1] "AZ" "05" [[4]] [1] "AZ" "08" [[5]] [1] "CA" "01" [[6]] [1] "CA" "05" [[7]] [1] "CA" "11" [[8]] [1] "CA" "16" [[9]] [1] "CA" "18" [[10]] [1] "CA" "21"

它可以变成一个矩阵,例如,通过

do.call(rbind, strsplit(District, "(?<=[A-Z]{2})", perl = TRUE))
 [,1] [,2] [1,] "AR" "01" [2,] "AZ" "03" [3,] "AZ" "05" [4,] "AZ" "08" [5,] "CA" "01" [6,] "CA" "05" [7,] "CA" "11" [8,] "CA" "16" [9,] "CA" "18" [10,] "CA" "21"

我们可以使用str_match在单独的列中捕获前两个字符和剩余的字符串。

stringr::str_match(District, "(..)(.*)")[, -1]

#      [,1] [,2]
# [1,] "AR" "01"
# [2,] "AZ" "03"
# [3,] "AZ" "05"
# [4,] "AZ" "08"
# [5,] "CA" "01"
# [6,] "CA" "05"
# [7,] "CA" "11"
# [8,] "CA" "16"
# [9,] "CA" "18"
#[10,] "CA" "21"

将其视为固定宽度的文件,并导入:

# read fixed width file
read.fwf(textConnection(District), widths = c(2, 2), colClasses = "character")
#    V1 V2
# 1  AR 01
# 2  AZ 03
# 3  AZ 05
# 4  AZ 08
# 5  CA 01
# 6  CA 05
# 7  CA 11
# 8  CA 16
# 9  CA 18
# 10 CA 21

使用tidyverse这很容易使用与tidyr separate的函数:

library(tidyverse)
District %>% 
  as.tibble() %>% 
  separate(value, c("state", "district"), sep = "(?<=[A-Z]{2})")

# A tibble: 10 × 2
   state district
   <chr> <chr>   
 1 AR    01      
 2 AZ    03      
 3 AZ    05      
 4 AZ    08      
 5 CA    01      
 6 CA    05      
 7 CA    11      
 8 CA    16      
 9 CA    18      
10 CA    21      

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM