Regex 如何正确使用separate()?

Regex 如何正确使用separate()?,regex,r,tidyr,Regex,R,Tidyr,我在提取表单中的ID时遇到一些困难: 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",

我在提取表单中的ID时遇到一些困难:

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吗?

尝试这样做,假设该ID始终是第一个unerscore之后的部分:

sapply(strsplit(a, "_"), function(x) x[[2]])
中间部分是你的身份证:

[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)]))
我认为你应该使用提取而不是分离。您需要指定要捕获的模式。我在这里假设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

你需要身份证和姓名还是只需要身份证?嗨,大卫,姓名是可选的。然而,看看名字是如何被提取出来的就好了。名字的模式是什么?它有什么不同吗?变量带有下划线。它通常用大写字母写。我不认为OP实际上有一个名字字符串,这似乎只是为了说明。你说的名字字符串是什么意思?df$a-vector每个元素开头的名称?我的意思是它可以包含任何字母,而不仅仅是名称。这就是我从评论中收集到的。。。。但我可能错了啊,好吧,是的,在这种情况下,我的解决方案不起作用,我改变了我的解决方案,这样无论第一部分之前的部分是什么,它都能起作用。但是你是对的,处理字符串很大程度上取决于基本假设,所以在解决方案中始终包含它们很重要我现在学到了一个教训
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