【问题标题】:Extract string between prefix and suffix提取前缀和后缀之间的字符串
【发布时间】:2018-03-22 16:11:47
【问题描述】:

我有这些栏目:

                 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

请帮忙。谢谢!

【问题讨论】:

  • 所以你想从 text.NANA 列中删除“.tif”还是更复杂?如果没有,使用substr() 可能会更容易
  • sub("^(RNDM.*)\\..*$", "\\1", dfrm$text.NANA).
  • 女性/男性信息也包含在同一列中,其间的空格数因行而异。有时是 1 个空格,有时是 2 个
  • @RuiBarradas,这让我"Female RNDM_MXN95.tif" "Male RNDM_QOS38.tif" "Female RNDM_WQW90.tif"

标签: r regex dataframe


【解决方案1】:

所以你只是想删除文件扩展名?使用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,因为它没有明确说明:通过阅读代码,绝对不清楚该代码的目的是什么。编写不言自明的代码,而不是需要在注释中解释的代码。

【讨论】:

  • 我也想去掉Male&Female,性别信息和条形码之间有任意数量的空格(有时1,有时2)
  • 啊,我知道了,我没有注意到它在同一列中。让我解决它
【解决方案2】:

你可以使用 sapply() 和 strsplit 来做这件事,让我告诉你:

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

应该可以的。

编辑:

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

【讨论】:

  • 这让我"Female RNDM" "Male RNDM" "Female RNDM" "Male RNDM"
  • 我错过了女性或男性
  • 更新后的答案让我"RNDM" "RNDM" "RNDM" "RNDM":D
  • 如果我得到例如,你可以在那里划定你想如何分割:X_asas.asdas 然后你把 [_.] 你将把你的字符串分成 3 个部分然后你选择你想要的部分
  • 不要用字符串引用 R 名称 ('['),而是使用反引号 (`[`); R 在这里甚至 allows 字符串引号这一事实在语言中是一个明显的错误,会导致不必要的混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 2011-10-05
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多