2015-06-25 1 views
-1

У меня есть некоторые трудности, чтобы извлечь идентификатор в виде:Как использовать отдельный() правильно?

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) 

Однако это время там многим подчеркиванием ... и мой подход терпит неудачу. Есть ли способ извлечь этот идентификатор?

+0

Вам необходимо как ID и NAME или просто 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

попробовать это (который предполагает, что идентификатор всегда часть после первого 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

Что вы подразумеваете под именем-string? 'NAME_' в начале каждого элемента вектора df $ a-vector? – grrgrrbla

+0

Я имею в виду, что он может содержать любые буквы, а не только «NAME». Это то, что я собираю из комментариев .... Но я могу ошибаться –