【问题标题】:Retrieving a partial string from a larger string in R从R中的较大字符串中检索部分字符串
【发布时间】:2017-11-29 15:57:48
【问题描述】:

我有一个数据集,其中每个观察值都有一个描述多个事物的 ID 值,例如 AE1 表示站点 A,类型 E,观察 1。我正在尝试为类型生成一个列,因此在上面的示例中我正在尝试在删除其他数据的同时过滤掉 E。

我已经研究过使用gsub,但是每个新的类型模式似乎都会覆盖以前的模式。似乎让我最接近的方法是使用gsubfn,如下所示:

library(gsubfn)

x <- c("AE1", "AE2", "AD1", "AD2", "BE1", "BE2", "BD1", "BD2")
y <- gsubfn(".", list("E" = "easy", "D" = "difficult"), x)

y

[1] "Aeasy1"      "Aeasy2"      "Adifficult1" "Adifficult2" "Beasy1"      "Beasy2"      "Bdifficult1" "Bdifficult2"

结果的问题是我仍然需要删除首字母和最后的数字。实际上,我有四种类型类别,而不仅仅是“E”和“D”

提前致谢。

【问题讨论】:

  • 正如@d.b 在我删除的答案下评论的那样,您可以使用substr(x, 2, 2) 提取中间字符。然后由您决定如何转换它,例如使用factor 或match 或merge 或...
  • 感谢你们俩。这两种方法都非常有效。

标签: r gsub gsubfn


【解决方案1】:

1) gsubfn 您的代码实际上已经非常接近了。而不是"." 使用".(.)." 作为正则表达式。这将匹配三个字符,其中中间将由列表处理。三个字符的整个匹配将被替换为处理结果。

library(gsubfn)

gsubfn(".(.).", list("E" = "easy", "D" = "difficult"), x)
## [1] "easy"      "easy"      "difficult" "difficult" "easy"      "easy"     
## [7] "difficult" "difficult"

2) strapply strapply 在同一个包中也可以。与其他*apply 函数一样,它首先需要对象,然后是限定符(在本例中为正则表达式),最后是列表(或函数或原型对象)。与gsubfn 不同,它不是将结果替换回输入字符串,而是返回处理的结果。

strapply(x, ".(.).", list("E" = "easy", "D" = "difficult"), simplify = TRUE)
## [1] "easy"      "easy"      "difficult" "difficult" "easy"      "easy"     
## [7] "difficult" "difficult"

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多