【问题标题】:How to match, extract and assign a pattern如何匹配、提取和分配模式
【发布时间】:2017-10-15 07:40:03
【问题描述】:

我有一些模式

A <- c("A..A","A.A","AA")
B <- c("B..B","B.B","BB")

以及data.frame中的一些序列及其频率

Seq     freq

CACCA     1

CAACC     2

BCCBC     3 

我需要将模式与序列匹配,提取并分配模式如下

Seq      freq   Pattern   From

CACCA     1   A..A      A

CAACC     2   AA        A

BCCBC     3   B..B      B

我使用grep匹配模式但它只返回整个序列,我如何提取匹配的模式并获取模式组。

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    您需要将AB 放入一个数据框中,并将stack 放入一个长格式中。

    d1 <- stack(data.frame(A, B, stringsAsFactors = FALSE))
    #  values ind
    #1   A..A   A
    #2    A.A   A
    #3     AA   A
    #4   B..B   B
    #5    B.B   B
    #6     BB   B    
    
    #use gsub to convert the Seq to the same format as A and B
    df$v1 <- gsub(' ', '.', trimws(gsub('[C-Z]', ' ', df$Seq)))
    #which gives [1] "A..A" "AA"   "B..B"
    
    df$From <- d1$ind[match(df$v1, d1$values)]
    
    df
    #    Seq freq   v1 From
    #1 CACCA    1 A..A    A
    #2 CAACC    2   AA    A
    #3 BCCBC    3 B..B    B
    

    【讨论】:

    • 谢谢你,索托斯。我有一个模式组列表,其中包含不同数量的模式。堆栈返回错误:参数暗示不同的行数:3、1、5。我可以将模式组转换为 data.frame,重命名并使用 rbind,想知道有没有一种巧妙的方法来做到这一点?
    • 你能举一个那个列表的例子吗?
    • @Xiao-yanPan 在不同长度的列表中 rbind 向量的标准方法是首先使它们的长度相同。 This should clarify
    • 嗨 Sotos,我使用 data= list (patternA, patternB, patternC) 然后 stack(unlist(data, recursive=FALSE)) 解决了问题,再次感谢您
    猜你喜欢
    • 2019-06-26
    • 2011-12-10
    相关资源
    最近更新 更多