R:在数据框列中找到特定字符的位置

时间:2016-07-07 17:43:48

标签: r string function

我一直在尝试复制一个我已经在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;解析具有此问题的记录。

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

2 个答案:

答案 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")
相关问题