2015-06-25 58 views
-1

我有一些困難的形式提取的ID:如何正確使用separate()?

27da12ce-85fe-3f28-92f9-e5235a5cf6ac 

從數據幀:

a<-c("NAME_27da12ce-85fe-3f28-92f9-e5235a5cf6ac_THOMAS_MYR", 
     "NAME_94773a8c-b71d-3be6-b57e-db9d8740bb98_THIMO", 
     "NAME_1ed571b4-1aef-3fe2-8f85-b757da2436ee_ALEX", 
     "NAME_9fbeda37-0e4f-37aa-86ef-11f907812397_JOHN_TYA", 
     "NAME_83ef784f-3128-35a1-8ff9-daab1c5f944b_BISHOP", 
     "NAME_39de28ca-5eca-3e6c-b5ea-5b82784cc6f4_DUE_TO", 
     "NAME_0a52a024-9305-3bf1-a0a6-84b009cc5af4_WIS_MICHAL", 
     "NAME_2520ebbb-7900-32c9-9f2d-178cf04f7efc_Sarah_Lu_Van_Gar/Thomas") 

其基本上在第一和第二之間下劃線的事情。

通常我的做法是由:

library(tidyr) 
df$a<-as.character(df$a) 
df<-df[grep("_", df$a), ] 
df<- separate(df, a, c("ID","Name") , sep = "_") 
df$a<-as.numeric(df$ID) 

但是這時候有一個很多下劃線......和我的方法失敗。有沒有辦法提取該ID?

+0

你需要兩個編號和名稱,或只是開始ID? –

+0

嗨大衛,名稱是可選的。然而,看看如何提取名稱會很好。 – Googme

+0

「NAME」的模式有什麼不同? –

回答

5

我認爲你應該使用extract而不是separate。您需要指定要捕獲的模式。我在這裏假設ID總是帶着一些,所以我的第一個數字後,捕捉一切,直到下一個_,然後一切後

df <- data.frame(a) 
df <- df[grep("_", df$a),, drop = FALSE] 
extract(df, a, c("ID", "NAME"), "[A-Za-z].*?(\\d.*?)_(.*)") 
#          ID     NAME 
# 1 27da12ce-85fe-3f28-92f9-e5235a5cf6ac    THOMAS_MYR 
# 2 94773a8c-b71d-3be6-b57e-db9d8740bb98     THIMO 
# 3 1ed571b4-1aef-3fe2-8f85-b757da2436ee     ALEX 
# 4 9fbeda37-0e4f-37aa-86ef-11f907812397    JOHN_TYA 
# 5 83ef784f-3128-35a1-8ff9-daab1c5f944b     BISHOP 
# 6 39de28ca-5eca-3e6c-b5ea-5b82784cc6f4     DUE_TO 
# 7 0a52a024-9305-3bf1-a0a6-84b009cc5af4    WIS_MICHAL 
# 8 2520ebbb-7900-32c9-9f2d-178cf04f7efc Sarah_Lu_Van_Gar/Thomas 
+1

Thx David。這就是我正在尋找的 - ... – Googme

1

試試這個(假定該ID總是第unerscore之後的部分):

sapply(strsplit(a, "_"), function(x) x[[2]]) 

,讓你 「中間部分」,這是您的ID:

[1] "27da12ce-85fe-3f28-92f9-e5235a5cf6ac" "94773a8c-b71d-3be6-b57e-db9d8740bb98" 
[3] "1ed571b4-1aef-3fe2-8f85-b757da2436ee" "9fbeda37-0e4f-37aa-86ef-11f907812397" 
[5] "83ef784f-3128-35a1-8ff9-daab1c5f944b" "39de28ca-5eca-3e6c-b5ea-5b82784cc6f4" 
[7] "0a52a024-9305-3bf1-a0a6-84b009cc5af4" "2520ebbb-7900-32c9-9f2d-178cf04f7efc" 

如果你想得到名稱以及一個簡單的解決方案(它假定名稱總是在第二個下劃線後面):

Names <- sapply(strsplit(a, "_"), function(x) Reduce(paste, x[-c(1,2)])) 

它給你這樣的:

[1] "THOMAS MYR"    "THIMO"     "ALEX"     "JOHN TYA"    
[5] "BISHOP"     "DUE TO"     "WIS MICHAL"    "Sarah Lu Van Gar/Thomas" 
+0

我不認爲OP實際上有'NAME'字符串,它似乎只是爲了說明。 –

+0

你是什麼意思的名字串?在df $ a-vector的每個元素開頭的'NAME_'? – grrgrrbla

+0

我的意思是可以包含任何字母,不只是'NAME'。這是我從評論中收集的內容....但我可能是錯誤的 –