在第一个逗号

时间:2015-09-01 15:08:37

标签: r string

我有一个名单,如" Mark M. Owens,M.D.,M.P.H。"我想排序名字,姓氏和头衔。使用此数据,标题始终在第一个逗号后开始,如果有标题。

我正在尝试将列表排序为:

FirstName LastName Titles Mark Owens M.D.,M.P.H Lara Kraft - Dale Good C.P.A

提前致谢。

以下是我的示例代码:

namelist <- c("Mark M. Owens, M.D., M.P.H.", "Dale C. Good, C.P.A", "Lara T. Kraft" , "Roland G. Bass, III")
firstnames=sub('^?(\\w+)?.*$','\\1',namelist)
lastnames=sub('.*?(\\w+)\\W+\\w+\\W*?$', '\\1', namelist)
titles = sub('.*,\\s*', '', namelist)
names <- data.frame(firstnames , lastnames, titles )

你可以看到,凭借这段代码,欧文斯先生并没有表现出来。他的标题从最后一个逗号开始,姓氏从P开头。你可以说我提到Extract last word in string in RExtract 2nd to last word in stringExtract last word in a string after comma if there are multiple words else the first word

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题,至少在测试数据上是这样的:

x=strsplit(namelist,split = ",")
x=rapply(object = x,function(x) gsub(pattern = "^ ",replacement = "",x =     x),how="replace")

names=sapply(x,function(y) y[[1]])
titles=sapply(x,function(y) if(length(unlist(y))>1){
    paste(na.omit(unlist(y)[2:length(unlist(y))]),collapse = ",")
}else{""})
names=strsplit(names,split=" ")
firstnames=sapply(names,function(y) y[[1]])
lastnames=sapply(names,function(y) y[[3]])

names <- data.frame(firstnames, lastnames, titles )
names

在这种情况下,当字符串的结构总是相同时,更容易使用像strsplit()这样的函数来提取所需的部分

答案 1 :(得分:1)

你有一个良好的开端所以你应该从那里开始。 firstnames变量写得很好。对于lastnames,我使用了修改后的名单。在sub函数内部是另一个消除了第一个逗号后的所有内容。姓氏将是字符串中的最后一个单词。对于titles,有一个两步过程,首先在第一个逗号之前删除所有内容,然后用连字符-替换不匹配的字符串。

namelist <- c("Mark M. Owens, M.D., M.P.H.", "Dale C. Good, C.P.A", "Lara T. Kraft" , "Roland G. Bass, III")
firstnames=sub('^?(\\w+)?.*$','\\1',namelist)
lastnames <- sub(".*?(\\w+)$", "\\1", sub(",.*", "", namelist), perl=TRUE)
titles <- sub(".*?,", "", namelist)
titles <- ifelse(titles == namelist, "-", titles)

names <- data.frame(firstnames , lastnames, titles )
  firstnames lastnames        titles
1       Mark     Owens  M.D., M.P.H.
2       Dale      Good         C.P.A
3       Lara     Kraft             -
4     Roland      Bass           III