2016-07-07 121 views
2

我一直在试图复制一个我已经用过很多SQL的移动,但似乎无法在R中找到等价物。我一直在搜索高位,低于名单和其他来源的解决方案,但无法找到我想要做的事情。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)])) 

但是一些名称有“。”而不是“,”分裂名称。例如,“Doe。John”。在其他情况下,我有两个“。”,即“Doe。John T.”。这里有一个例子:

> 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" 

对于这些情况下,我试图找到第一个“。”的位置。以便我可以使用用户定义的函数来分割名称。以下是这些功能。

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) 

我玩过apply和sapply,但我很明显错过了一些东西,因为它们看起来不起作用。

我的计划是使用ifelse函数来应用“。”解析到有这个问题的记录。

我担心答案很简单。但我卡住了。非常感谢你的帮助。

+0

只是通过正则表达式来'strsplit',例如'strsplit(c('hello.world','hello,world'),'\\。|,')'。你也可以看看'tidyr :: separate'。 – alistaire

+0

哇。我试过但未能取消“。”与“\\”。非常感谢alistaire。 –

+0

我认为明智的做法是用逗号替换所有应该用逗号逗号的点,例如'gsub('(\\ w \\ w)[。](。)','\\ 1,\\ 2 ',crm $ DEF_NAME)',然后执行'strsplit'。 –

回答

3

我只想修改原有的功能namesplit这样:

namesplit <- strsplit(crm$DEF_NAME, ',|\\.') 

将各执,.

而且,也许改变你的名字函数

crm$FIRST_NAME <- trimws(sapply(namesplit, function(x) x[2:length(x)])) 

赶,那里是一个逗号或句号,是不是在最后的位置的任何实例。

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") 
+0

第二列的名称应该是'LAST_NAME2'和参数'remove = TRUE',以保持原始列不变。和'sep =“[,.]”'来覆盖OP的需求。 – Marek

相关问题