在分隔符后分割字符串几个字符

时间:2016-11-17 19:09:33

标签: r string strsplit

我有一个大型的名称和状态数据集,我需要拆分。拆分后,我想创建具有每个名称和状态的新行。我的数据字符串有多行,看起来像这样

"Peter Johnson, IN Chet Charles, TX Ed Walsh, AZ"
"Ralph Hogan, TX, Michael Johnson, FL"

我需要数据看起来像这样

attr      name            state
1         Peter Johnson   IN
2         Chet Charles    TX
3         Ed Walsh        AZ
4         Ralph Hogan     TX
5         Michael Johnson FL

我无法弄清楚如何做到这一点,也许在逗号之后将它分成几个字符?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:-1)

如果是多行字符串,那么我们可以使用gsub创建分隔符,使用strsplit拆分字符串,使用data.frame的组件创建split输出listrbind它们在一起。

d1 <- do.call(rbind, lapply(strsplit(gsub("([A-Z]{2})(\\s+|,)",
                    "\\1;", lines), "[,;]"), function(x) {
                        x1 <- trimws(x)
       data.frame(name = x1[c(TRUE, FALSE)],state = x1[c(FALSE, TRUE)]) }))     
cbind(attr = seq_len(nrow(d1)), d1)
#  attr            name state
#1    1   Peter Johnson    IN
#2    2    Chet Charles    TX
#3    3        Ed Walsh    AZ
#4    4     Ralph Hogan    TX
#5    5 Michael Johnson    FL

或者这可以以紧凑的方式完成

library(data.table)
fread(paste(gsub("([A-Z]{2})(\\s+|,)", "\\1\n", lines), collapse="\n"),
        col.names = c("names", "state"), header = FALSE)[, attr := 1:.N][]
#             names state attr
#1:   Peter Johnson    IN    1
#2:    Chet Charles    TX    2
#3:        Ed Walsh    AZ    3
#4:     Ralph Hogan    TX    4
#5: Michael Johnson    FL    5

数据

lines <- readLines(textConnection("Peter Johnson, IN Chet Charles, TX Ed Walsh, AZ
 Ralph Hogan, TX, Michael Johnson, FL"))