在第一个空格上拆分字符串

Tyl*_*ker 23 regex r

我想将字符串(人名)的矢量分成两列(向量).问题是有些人有一个"两个字"的姓氏.我想将名字和姓氏分成两列.我可以使用下面的代码切出并使用名字,但姓氏使我无效.(看看下面的样本集中的obs 29,以获得一个想法,因为福特有一个必须保持在一起的Pantera L的"姓氏")

到目前为止我试图做的事情;

x<-rownames(mtcars)
unlist(strsplit(x, " .*"))
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像:

            MANUF       MAKE
27          Porsche     914-2
28          Lotus       Europa
29          Ford        Pantera L
30          Ferrari     Dino
31          Maserati    Bora
32          Volvo       142E
Run Code Online (Sandbox Code Playgroud)

Jos*_*ich 26

正则表达式rexp匹配字符串开头的单词,可选空格,然后是字符串的其余部分.括号是作为反向引用访问子表达式\\1\\2.

rexp <- "^(\\w+)\\s?(.*)$"
y <- data.frame(MANUF=sub(rexp,"\\1",x), MAKE=sub(rexp,"\\2",x))
tail(y)
#       MANUF      MAKE
# 27  Porsche     914-2
# 28    Lotus    Europa
# 29     Ford Pantera L
# 30  Ferrari      Dino
# 31 Maserati      Bora
# 32    Volvo      142E
Run Code Online (Sandbox Code Playgroud)


Xu *_*ang 17

对我来说,Hadley colsplitreshape2包装中的功能是最直观的.约书亚的方式更为通用(即可以在任何可以使用正则表达式的地方使用)和灵活的(如果你想改变规范); 但该colsplit功能非常适合这种特定设置:

library(reshape2)
y <- colsplit(x," ",c("MANUF","MAKE"))
tail(y)
#      MANUF      MAKE
#27  Porsche     914-2
#28    Lotus    Europa
#29     Ford Pantera L
#30  Ferrari      Dino
#31 Maserati      Bora
#32    Volvo      142E
Run Code Online (Sandbox Code Playgroud)


G. *_*eck 11

这有两种方法:

1)strsplit.此方法仅使用R核心中的函数,并且不使用复杂的正则表达式.在分号上用分号(使用sub 使用gsub)替换第一个空格,strsplit然后将rbind其替换为2列矩阵:

mat <- do.call("rbind", strsplit(sub(" ", ";", x), ";"))
colnames(mat) <- c("MANUF", "MAKE")
Run Code Online (Sandbox Code Playgroud)

2)gsubfn包中的strapply 这是gsubfn包中的单行使用strapply.正则表达式的两个带括号的部分分别捕获所需的第一列和第二列,并且函数(在公式表示法中指定 - 与指定相同function(x, y) c(MANUF = x, MAKE = y))抓取它们并添加名称.该simplify=rbind论点用于将其转换为如先前解决方案中的矩阵.

library(gsubfn)
mat <- strapply(x, "(\\S+)\\s+(.*)", ~ c(MANUF = x, MAKE = y), simplify = rbind)
Run Code Online (Sandbox Code Playgroud)

注意:在任何一种情况下,都会返回"character"矩阵mat.如果"character"需要列的数据框,则添加以下内容:

DF <- as.data.frame(mat, stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

stringsAsFactors如果需要"factor"列,则省略参数.


Ric*_*ton 7

另一种方法:

str_splitfrom stringr将处理拆分,但以不同的形式返回它(列表,如同strsplit).然而,操纵到正确的形式是很简单的.

library(stringr)
split_x <- str_split(x, " ", 2)
(y <- data.frame(
  MANUF = sapply(split_x, head, n = 1),
  MAKE  = sapply(split_x, tail, n = 1)
))
Run Code Online (Sandbox Code Playgroud)

或者,正如哈德利在评论中提到的那样str_split_fixed.

y <- as.data.frame(str_split_fixed(x, " ", 2))
colnames(y) <- c("MANUF", "MAKE")
y
Run Code Online (Sandbox Code Playgroud)

  • 使用`str_split_fixed`会更好 (2认同)