0

我有一个命名的字符串列表:

str(nr.genes)
 Named chr [1:37] "0" "0" "Pipas_c034_0013" "Pipas_chr1-4_0040" ...
 - attr(*, "names")= chr [1:37] "Nr11" "Nr12" "Nr131" "Nr132" ...

我想用字符串名称替换下一个对象中的名称,但不是 1-to-1 :

str(nr.genes.names)
 chr [1:16] "up.p33-dw.p33" "up.p33-dw.p38" "up.p33-dw.p52" ...

我想要这样的东西:

 str(nr.genes)
 Named chr [1:37] "0" "0" "Pipas_c034_0013" "Pipas_chr1-4_0040" ...
 - attr(*, "names")= chr [1:37] "up.p33-dw.p33" "up.p33-dw.p38" "up.p33-dw.p52" "up.p33-dw.p52" ...

我手动更改的地方

"Nr11"<-"up.p33-dw.p33"
"Nr12"<-"up.p33-dw.p38"
"Nr131"<-"up.p33-dw.p52"
"Nr132"<-"up.p33-dw.p52" #Note that the third digit doesn't matter
       .
       . 
       .

我需要根据前 2 位数字将每个字符串的名称替换为第二个 list 的元素。我尝试了一个 lapply 函数,但我没有管理,我也尝试创建一个涉及sub和替换的函数,但我看不到任何变化,下面是代码:

lfun <- function(x,y) {
  for(o in 1:16){ #Length of the names to substitue for
    for (p in 1:4){ 
      for (q in 1:4){
       x[sub(paste("Nr", p, q, sep=""), x[o], replacement=y[o])]
      }
    }
  }
}

使用这个函数,我尝试获取第一个参数的所有属性名称,并用它所暗示的元素替换它们。但它返回的结果与我之前的相同,没有任何警告或错误消息。我敢肯定一定有一个简单的方法来做到这一点,但我没有找到正确的


编辑:nr.genes 可以创建如下

nr.genes <- c("0", "0", "Pipas_c034_0013", "Pipas_chr1-4_0040")
attr(nr.genes, "names") <-c("Nr11", "Nr12", "Nr131", "Nr132")

和nr.genes。名字由

nr.genes.names <- c("up.p33-dw.p33", "up.p33-dw.p38", "up.p33-dw.p52")

关于匹配我需要那个Nr11 <-"up.p33-dw.p33",但是Nr21<-"<nr.genes.names[5]>",然后Nr22<-"<nr.genes.names[6]>",Nr23<-"<nr.genes.names[7]>"然后 Nr24<-"",然后Nr31 <-"<nr.genes.names[9]>"

4

1 回答 1

2

gsub例如,您可以从 nr.genes 名称中提取第二个数字,并将其用作 nr.genes.names 中的索引。

new <- c("up.p33-dw.p33","up.p33-dw.p38", "up.p33-dw.p52")
old <- c("Nr11" ,"Nr12", "Nr131", "Nr132" )

old <- new[as.integer(gsub('^Nr[0-9]([0-9]).*','\\1',old))]

[1] "up.p33-dw.p33" "up.p33-dw.p38" "up.p33-dw.p52" "up.p33-dw.p52"

编辑

您的匹配规则不清楚,也许您没有规则,只有 16 项要匹配。在这种情况下,您可以使用merge来匹配基因及其名称。

例如,您可以创建一个 data.frame,在其中列出每个基因的精确匹配,如下面的 dat.match data.frame。这里我用letters[1:16]16 个 nr.genes.names 来表示。

dd <- expand.grid(1:4,1:4)
dat.match <- data.frame(nr = paste0('Nr',mapply(paste0,dd[,1],dd[,2])),
                       gene =letters[seq_len(16)])

   nr gene
1  Nr11    a
2  Nr21    b
3  Nr31    c
4  Nr41    d
5  Nr12    e
6  Nr22    f
7  Nr32    g
8  Nr42    h
9  Nr13    i
10 Nr23    j
11 Nr33    k
12 Nr43    l
13 Nr14    m
14 Nr24    n
15 Nr34    o
16 Nr44    p

然后你可以merge像这样使用:

nr.genes <-c("Nr11", "Nr12", "Nr131", "Nr132")
genes <- data.frame(nr=gsub('(^Nr[0-9]{2}).*','\\1',nr.genes))
merge(genes,dat.match)

  nr gene
1 Nr11    a
2 Nr12    e
3 Nr13    i
4 Nr13    i
于 2013-10-25T10:26:15.527 回答