将字符串拆分为新列

时间:2017-09-18 13:59:19

标签: r dplyr

我正在处理data.frame,尝试在 , . 之间提取字符串的一部分并放置进入一个新的专栏。我想使用dplyr。

library(dplyr)

name <- c("Cumings, Mrs. John Bradley","Heikkinen, Miss. Laina","Moran, Mr. James","Allen, Mr. William Henry","Futrelle, Mrs. Jacques Heath (Lily May Peel)")
sex <- c("female","female","male","male","female")
age <- c(22,23,24,37,42)
data <- data.frame(name,sex,age)

所以我想把Mrs,Misss,Mr等提取到一个专栏中。

data %>%
  mutate(title = strsplit(name, split = "[,.]")) %>%
  select(name,title)

6 个答案:

答案 0 :(得分:2)

使用,.

删除gsub(".*, |\\..*", "", name)以外的所有内容
library(dplyr)
data %>% mutate(title = gsub(".*, |\\..*", "", name))

enter image description here

gsub(".*, ", "", name):删除,之前的所有内容,,本身以及之后的空格。 gsub("\\..*", "", name):删除.及其后的所有内容 |结合了两个gsub模式。

答案 1 :(得分:1)

str_extract将检索每个字符串中的第一个实例:

library(dplyr)
library(stringr)

data <- data.frame(name,sex,age) %>% 
  mutate(title = str_extract(name, ",.+\\."),
         title = str_replace_all(title, "([[:punct:]]| )", ""))

稍微有效的解决方案:

data %>% 
      mutate(title = str_trim(str_extract(name, regex("(?<=,).*?(?=\\.)"))))

(?<=,)表示要照看逗号,(?=\\.)表示要在句号之前查看,而.*?表示抓住其中的所有内容。 str_trim删除前导和尾随空格。

答案 2 :(得分:1)

我对dplyr问题没有答案。

我只是想提一下,这种将名称与名称分开的方式在使用真实世界数据时可能会遇到多种错误。

更好(但仍然容易出错)的方法是在利用正则表达式时创建常见称呼的查找表。

分割数据的优势在于,如果正则表达式中没有命中,它仍然为空(NA)并且可以轻松地手动修复,但不会在第一步中创建不一致的数据。

答案 3 :(得分:1)

不使用任何外部包

data$title <- with(data, sub("^[^,]+,\\s*(\\S+).*", "\\1", name))
data$title
#[1] "Mrs."  "Miss." "Mr."   "Mr."   "Mrs." 

答案 4 :(得分:1)

与@ Benjamin的答案类似(Base R相当于str_extract_all),以下是使用regmatches + gregexpr +积极向前看的方法:

library(dplyr)
data %>%
  mutate(title = regmatches(data$name, gregexpr("\\b[[:alpha:]]+(?=[.])", 
                                                data$name, perl = TRUE))) %>%
  select(name,title)

结果:

                                          name title
1                   Cumings, Mrs. John Bradley   Mrs
2                       Heikkinen, Miss. Laina  Miss
3                             Moran, Mr. James    Mr
4                     Allen, Mr. William Henry    Mr
5 Futrelle, Mrs. Jacques Heath (Lily May Peel)   Mrs

\\b匹配“单词边界”,在这种情况下是一个空格。需要perl = TRUE才能利用积极前瞻(?=[.]),这实际上是“仅当模式后面跟.

答案 5 :(得分:0)

猜猜是这样的:data %>% mutate(title = gsub(".*, |\\..*", "", name))