2016-07-07 9 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"などです。他の場合には、私は2つの "。"すなわち "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) 

私はとsapply適用し、周りにプレイしましたが、彼らが動作していないようですので、私は明らかに何かが欠けています。

ifelse関数を使用して "。"を適用することを計画していました。この問題が発生しているレコードを解析します。

私は答えが簡単であることを恐れる。しかし、私は立ち往生しています。助けてくれてありがとう。

+0

ただ、例えば、strsplit' 'に正規表現を渡します'strsplit(c( 'hello.world'、 'hello、world')、 '\\。|、')'です。また、 'tidyr :: separate'をチェックすることもできます。 – alistaire

+0

うわー。私はそれを試みたが、 "。" "\\"とします。本当にありがとうございました。 –

+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)])) 

にあなたの最初の名前の機能を変更します。 tidyrで

1

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

元の列をそのまま残すために、2列目の名前は 'LAST_NAME2'で、引数は' remove = TRUE'でなければなりません。 OPのニーズをカバーするために 'sep =" [、。] "' – Marek

関連する問題