我一直在尝试复制一个我已经在SQL中使用过很多但却无法在R中找到等价物的动作。我一直在列表中搜索高低解决方案的其他来源,但无法找到我想要做的事情。
我有一个带有全名变量的数据框,例如" Doe,John"。我已经能够使用以下代码拆分这些名称:
# creates a split name matrix for each record
namesplit <- strsplit(crm$DEF_NAME, ',')
# takes the first/left part of matrix, after the comma
crm$LAST_NAME <- trimws(sapply(namesplit, function(x) x[1]))
# takes the last/right part of the matrix, after the comma
crm$FIRST_NAME <- trimws(sapply(namesplit, function(x) x[length(x)]))
但有些名字有&#34;。&#34;而不是&#34;,&#34;拆分名称。例如,&#34; Doe。约翰&#34 ;.在其他情况下,我有两个&#34;。&#34;,即&#34; Doe。 John T。&#34;。这是一个例子:
> test$LAST_NAME
[1] "DEWITT. B" "TAOY. PETER" "ZULLO. JASON"
[4] "LAWLOR. JOSEPH" "CRAWFORD. ADAM" "HILL. ROBERT W."
[7] "TAGERT. CHRISTOPHER" "ROSEBERY. SCOTT W." "PAYNE. ALBERT"
[10] "BUNTZ. BRIAN JOHN" "COLON. PERFECTO GAUD" "DIAZ. JOSE CANO"
[13] "COLON. ERIK D." "COLON. ERIK D." "MARTINEZ. DAVID C."
[16] "DRISKELL. JASON" "JOHNSON. ALEXANDER" "JACKSON. RONNIE WAYNE"
[19] "SIPE. DAVID J." "FRANCO. BRANDT" "FRANCO. BRANDT"
对于这些情况,我试图找到第一个&#34;的位置。&#34;这样我就可以使用用户定义的函数来拆分名称。这是那些功能。
left = function (string,char){
substr(string,1,char)}
right = function (string, char){
substr(string,nchar(string)-(char-1),nchar(string))}
我在以下方面取得了一些成功,但它仅取得了第一条记录的位置,因此例如它会抓取所有记录的位置6,而不是每行更改一次。
test$LAST_NAME2 <- left(test$LAST_NAME,
which(strsplit(test$LAST_NAME, '')[[1]]=='.')-1)
我已经玩过申请和祝福,但我显然错过了一些东西,因为他们似乎没有工作。
我的计划是使用ifelse函数来应用&#34;。&#34;解析具有此问题的记录。
我担心答案很简单。但是我被卡住了。非常感谢你的帮助。
答案 0 :(得分:3)
我只想将原始函数namesplit
修改为:
namesplit <- strsplit(crm$DEF_NAME, ',|\\.')
将分为,
或.
。
另外,也许可以将您的名字功能更改为
crm$FIRST_NAME <- trimws(sapply(namesplit, function(x) x[2:length(x)]))
捕获逗号或句号不在最后位置的任何实例。
答案 1 :(得分:1)
有了tidyr,
library(tidyr)
test %>% separate(LAST_NAME, into = c('LAST_NAME', 'FIRST_NAME'), extra = 'merge')
## LAST_NAME FIRST_NAME
## 1 DEWITT B
## 2 LAWLOR JOSEPH
## 3 TAGERT CHRISTOPHER
## 4 BUNTZ BRIAN JOHN
## 5 COLON ERIK D.
## 6 DRISKELL JASON
## 7 SIPE DAVID J.
## 8 TAOY PETER
## 9 CRAWFORD ADAM
## 10 ROSEBERY SCOTT W.
## 11 COLON PERFECTO GAUD
## 12 COLON ERIK D.
## 13 JOHNSON ALEXANDER
## 14 FRANCO BRANDT
## 15 ZULLO JASON
## 16 HILL ROBERT W.
## 17 PAYNE ALBERT
## 18 DIAZ JOSE CANO
## 19 MARTINEZ DAVID C.
## 20 JACKSON RONNIE WAYNE
## 21 FRANCO BRANDT
数据
test <- structure(list(LAST_NAME = c("DEWITT. B", "LAWLOR. JOSEPH", "TAGERT. CHRISTOPHER",
"BUNTZ. BRIAN JOHN", "COLON. ERIK D.", "DRISKELL. JASON", "SIPE. DAVID J.",
"TAOY. PETER", "CRAWFORD. ADAM", "ROSEBERY. SCOTT W.", "COLON. PERFECTO GAUD",
"COLON. ERIK D.", "JOHNSON. ALEXANDER", "FRANCO. BRANDT", "ZULLO. JASON",
"HILL. ROBERT W.", "PAYNE. ALBERT", "DIAZ. JOSE CANO", "MARTINEZ. DAVID C.",
"JACKSON. RONNIE WAYNE", "FRANCO. BRANDT")), row.names = c(NA,
-21L), class = "data.frame", .Names = "LAST_NAME")