【问题标题】:Extracting a word from string from n rows and apend that word as a new col in R从 n 行中从字符串中提取一个单词并将该单词作为新的列附加到 R 中
【发布时间】:2017-12-21 13:52:32
【问题描述】:

我有一个包含 3 列并有 15565 个观察值的数据集。其中一列在同一行中有多个单词。 我要做的是从每一行中提取一个特定的单词并将其附加到一个新列中(我总共有 4 个列) 问题是我要找的词不一样,而且它们并不总是在同一个位置。 这是我的 DS 的摘录:

x y z 1 T 3C00652722 (T558799A) 2 T NA >> MSP: T0578836A & 3C03024632 3 T T0579010A, 3C03051500, EAET03051496 4 U T0023231A > MSP: T0577506A & 3C02808556 8 U (T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502

我希望提取所有以 3C 开头并且长度为 10 个字符的单词,然后将其附加到一个新的列中,因此它看起来像这样:

x y z R
1 T 3C00652722 (T558799A) 3C00652722 2 T NA >> MSP: T0578836A & 3C03024632 3C03024632 3 T T0579010A, 3C03051500, EAET03051496 3C03051500 4 U T0023231A > MSP: T0577506A & 3C02808556 3C02808556 8 U >POPMigr.T576447A,C72/221816*3C00721502 3C00721502

我尝试使用 stringr gprep 库但无济于事。

【问题讨论】:

    标签: r string extract


    【解决方案1】:

    我们可以通过str_extract 做到这一点

    library(stringr)
    df1$R <- str_extract(df1$z, "\\b3C[^, ]{8}")
    df1$R
    #[1] "3C00652722" "3C03024632" "3C03051500" "3C02808556" "3C00721502"
    

    【讨论】:

    • 我认为这比使用gsub 更好,因为它不能很好地处理输入可能与模式不匹配的情况。 str_extract 将返回 NA,这是一个不匹配 +1 的合适占位符。
    • @akrun 你是上帝的伙伴!非常感谢!在过去的 24 小时里,我一直在努力工作!
    • @RaulGonzales 很高兴知道它有帮助。我只是一个通过不断练习而对编程充满热情的普通人......
    • @akrun 一个普通人??我不这么认为:) (this guy too)。无论如何,您的帮助对 SO 社区非常重要。非常感谢伙计!
    【解决方案2】:

    虽然akrun's 解决方案是一种简单而优雅的方法,但为了方便起见,我发布了另一个基于stringr 库和substring 方法的解决方案。

    library(stringr)
    
    x <- c(1,2,3,4,8)
    y <- c('T','T','T','U','U')
    z <- c('3C00652722 (T558799A)', 'NA >> MSP: T0578836A & 3C03024632', 'T0579010A, 3C03051500, EAET03051496',
       'T0023231A > MSP: T0577506A & 3C02808556', '(T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502')
    
    dt <- data.frame(x,y,z)
    
    charLoc <- str_locate(pattern = "3C", dt$z)
    idx <- list()
    for (s in 1:dim(charLoc)[1]) {
      idx[s] <- substring(dt$z[s], first = charLoc[s,][1], last = charLoc[s,][1]+9)
    }
    dt$val <- sapply(idx, paste0, collapse=",")
    print(head(dt))
    

    同样的输出是

      x y                                                           z        val
    1 1 T                                       3C00652722 (T558799A) 3C00652722
    2 2 T                           NA >> MSP: T0578836A & 3C03024632 3C03024632
    3 3 T                         T0579010A, 3C03051500, EAET03051496 3C03051500
    4 4 U                     T0023231A > MSP: T0577506A & 3C02808556 3C02808556
    5 8 U (T561041A C72/59460)>POPMigr.T576447A,C72/221816*3C00721502 3C00721502
    

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 2015-05-08
      • 2016-09-10
      相关资源
      最近更新 更多