2013-10-25 83 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

相關問題