在前缀和后缀之间提取字符串

时间:2018-03-22 16:11:47

标签: r regex dataframe

我有这些专栏:

                 text.NANA text.22 text.32
1    Female RNDM_MXN95.tif      No      NA
12     Male RNDM_QOS38.tif      No      NA
13  Female  RNDM_WQW90.tif      No      NA
14    Male  RNDM_BKD94.tif      No      NA
15    Male  RNDM_LGD67.tif      No      NA
16   Female RNDM_AFP45.tif      No      NA

我想创建一个只包含以RNDM_开头且以.tif结尾的条形码的列,但不包括.tif。棘手的部分是摆脱同一列中的性别信息。性别信息与RNDM_

之间存在随机数量的空格
                 text.NANA text.22 text.32    BARCODE
1    Female RNDM_MXN95.tif      No      NA RNDM_MXN95
12     Male RNDM_QOS38.tif      No      NA RNDM_QOS38
13  Female  RNDM_WQW90.tif      No      NA RNDM_WQW90
14    Male  RNDM_BKD94.tif      No      NA RNDM_BKD94
15    Male  RNDM_LGD67.tif      No      NA RNDM_LGD67
16   Female RNDM_AFP45.tif      No      NA RNDM_AFP45

我对此做了一次非常糟糕的尝试,但它没有奏效:

dfrm$BARCODE <- regexpr("RNDM_", dfrm$text.NANA)
# [1] 8 6 9 7 7 8 9 9 8 8 9 9 6 6 7 8 9 8
# attr(,"match.length")
# [1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
# attr(,"useBytes")
# [1] TRUE

请帮忙。谢谢!

2 个答案:

答案 0 :(得分:2)

所以你只想删除文件扩展名?使用file_path_sans_ext

dfrm$BARCODE = file_path_sans_ext(dfrm$text.NANA)

如果前面有更多内容,您可以使用以下正则表达式来提取后缀:

dfrm$BARCODE = stringr::str_match(dfrm$text.NANA, '(RNDM_.*)\\.tif')[, 2]

请注意,我在这里使用{stringr}包,因为用于提取正则表达式匹配的基本R函数非常糟糕。没有人使用它们。

我强烈建议使用strsplit来使用,因为它未被指定:从阅读代码时,我们绝对不清楚该代码的用途是什么。编写不言自明的代码,而不是需要在评论中解释的代码。

答案 1 :(得分:0)

你可以使用sapply()和strsplit轻松完成,让我告诉你:

sapply(strsplit(dfrm$text.NANA, "_"),"[", 1)

这应该有效。

编辑:

sapply(strsplit(x, "[ .]+"),"[", 2)