![](/img/trans.png)
[英]In R, how do I split each string in a vector to return everything before the Nth instance of a character?
[英]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.