我想将字符串(人名)的矢量分成两列(向量).问题是有些人有一个"两个字"的姓氏.我想将名字和姓氏分成两列.我可以使用下面的代码切出并使用名字,但姓氏使我无效.(看看下面的样本集中的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 colsplit在reshape2包装中的功能是最直观的.约书亚的方式更为通用(即可以在任何可以使用正则表达式的地方使用)和灵活的(如果你想改变规范); 但该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"列,则省略参数.
另一种方法:
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)
| 归档时间: |
|
| 查看次数: |
16245 次 |
| 最近记录: |