我有一个名单,如" 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 R,Extract 2nd to last word in string和Extract last word in a string after comma if there are multiple words else the first word
答案 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