2013-10-25 86 views
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比1,S

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 number doesn't matter 
     . 
     . 
     . 

我需要根据前两个数字,第二个列表的元素来替换每个属性的名称。我曾尝试与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创建。基因。通过

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]>"

+1

您好,欢迎计算器!如果您提供[最小,可重现的数据集],您更有可能收到有用答案(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/ 5963610#5963610)。你能否也请澄清'nr.genes'与'nr.genes.names'匹配的'规则'。谢谢! – Henrik

+0

你不回答Henrik在这里回答!您的匹配规则不明确。 Nr11 < - “up.p33-dw.p33”,但Nr21 < - “”?我在这里没有看到任何关系! – agstudy

+0

这个数字来自两组对象之间的比较,每组有4个数据(这就是为什么Nr从11,12,13,14,21,22,23,24,31,32,33,34, 42,43,44),这是他们之间的比较。为了做这个比较,我做了一个循环,将每个结果存储在这个对象名称Nr + + 中,但是要使用'unlist(mget(nr.list))'(nr。列表是我存储所有Nr对象的地方),它将这个第三个数字分开并添加到names属性中。所以我想从这个基因的比较中弄清楚。 – Llopis

回答

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,列出每个基因的extact匹配,如下面的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 
+0

它运作良好,但只为前8个,而不是所有16个名字,我必须在37个长度nr.genes中替代。但是,谢谢,我会尝试用'gsub'找到路。 – Llopis

+0

@Llopis看到我的编辑! – agstudy

+0

我试过这种方式,但是,在我的情况下,网格更大,没有模式:这里是:attr(nr.genes,“names”) [1]“Nr11”“Nr12”“Nr131”“Nr132”“ Nr133“”Nr134“”Nr141“”Nr142“”Nr21“ [10]”Nr22“”Nr231“”Nr232“”Nr233“”Nr234“”Nr235“”Nr236“”Nr237“”Nr24“ [19]” Nr311“”Nr312“”Nr321“”Nr322“”Nr323“”Nr33“”Nr341“”Nr342“”Nr41“ ”Nr421“”Nr422“”Nr431“”Nr432“”Nr433“”Nr434“”Nr435 “”Nr436“”Nr437“ [37]”Nr44“' – Llopis

相关问题