2011-06-09 80 views
2

我有一個使用gsub的問題。我的數據的rownames具有相同的部分名稱。見下文:R:用子串替換數據幀的rownames [2]

> rownames(test) 
[1] "U2OS.EV.2.7.9" "U2OS.PIM.2.7.9" "U2OS.WDR.2.7.9" "U2OS.MYC.2.7.9" 
[5] "U2OS.OBX.2.7.9" "U2OS.EV.18.6.9" "U2O2.PIM.18.6.9" "U2OS.WDR.18.6.9" 
[9] "U2OS.MYC.18.6.9" "U2OS.OBX.18.6.9" "X1.U2OS...OBX" "X2.U2OS...MYC" 
[13] "X3.U2OS...WDR82" "X4.U2OS...PIM" "X5.U2OS...EV" "exp1.U2OS.EV" 
[17] "exp1.U2OS.MYC" "EXP1.U20S..PIM1" "EXP1.U2OS.WDR82" "EXP1.U20S.OBX" 
[21] "EXP2.U2OS.EV" "EXP2.U2OS.MYC" "EXP2.U2OS.PIM1" "EXP2.U2OS.WDR82" 
[25] "EXP2.U2OS.OBX" 

在我以前的問題,我問是否有一種方法來獲取相同的部分名稱相同的名稱。看到這個問題:Replacing rownames of data frame by a sub-string

答案是一個非常好的解決方案。該功能GSUB用這種方式:

transfecties = gsub(".*(MYC|EV|PIM|WDR|OBX).*", "\\1", rownames(test) 

現在,我還有一個問題,我有R運行程序(Galaxy)不承認|字符。我的問題是,是否有另一種方法來使用相同的解決方案,而不使用此|?

謝謝!

+1

我很抱歉,但我不明白。你用R運行什麼程序?你會得到什麼錯誤? – Andrie 2011-06-09 10:28:09

+0

我在R星系中運行R(http://main.g2.bx.psu.edu/),我需要用這種方式填寫變量:MYC | EV | PIM | WDR | OBX但是星系不能識別它 – Lisann 2011-06-09 10:31:07

+0

您是否嘗試過逃避或雙重逃避'|'標誌? – 2011-06-09 10:35:02

回答

2

如果您不想使用「|」字符,你可以嘗試這樣的:

Rnames <- 
c("U2OS.EV.2.7.9", "U2OS.PIM.2.7.9", "U2OS.WDR.2.7.9", "U2OS.MYC.2.7.9" , 
"U2OS.OBX.2.7.9" , "U2OS.EV.18.6.9" ,"U2O2.PIM.18.6.9" ,"U2OS.WDR.18.6.9" ) 

Rlevels <- c("MYC","EV","PIM","WDR","OBX")  
tmp <- sapply(Rlevels,grepl,Rnames) 
apply(tmp,1,function(i)colnames(tmp)[i]) 
[1] "EV" "PIM" "WDR" "MYC" "OBX" "EV" "PIM" "WDR" 

但我會認真考慮這一提的球隊星系,因爲它似乎是相當尷尬不能夠使用符號或...

+0

感謝Joris Meys,此解決方案適用於與星系組合使用的R。當然,我會問銀河開發商爲什麼它不符合字符| – Lisann 2011-06-09 11:44:31

2

不會建議在R中這樣做一般,因爲它遠低於所提供的solution @csgillespie的效率,但另一種方法是循環遍歷各個要匹配的字符串並分別對每個字符串進行替換,即搜索"MYN"並僅替換匹配"MYN"的rownames。

下面是使用@ csgillespie的Answerx數據爲例:

x <- c("U2OS.EV.2.7.9", "U2OS.PIM.2.7.9", "U2OS.WDR.2.7.9", "U2OS.MYC.2.7.9", 
     "U2OS.OBX.2.7.9", "U2OS.EV.18.6.9", "U2O2.PIM.18.6.9","U2OS.WDR.18.6.9", 
     "U2OS.MYC.18.6.9","U2OS.OBX.18.6.9", "X1.U2OS...OBX","X2.U2OS...MYC") 

的數據複製,所以我們有一些有更高版本(這只是例子)來比較:

x2 <- x 

然後創建一個你想匹配的字符串列表:

matches <- c("MYC","EV","PIM","WDR","OBX") 

然後我們循環遍歷matches的價值觀和做的三件事(代碼編號##X):

  1. 用正則表達式的其他位粘貼在一起的電流匹配串i創建正則表達式,我們要使用時,
  2. 使用grepl()我們返回包含字符串的x2這些元素的邏輯指標i
  3. 然後,我們使用相同的樣式gsub()通話,你已經顯示,但是隻能使用相匹配的字符串的x2元素,並只取代那些元素。

的循環是:

for(i in matches) { 
    rgexp <- paste(".*(", i, ").*", sep = "") ## 1 
    ind <- grepl(rgexp, x)     ## 2 
    x2[ind] <- gsub(rgexp, "\\1", x2[ind]) ## 3 
} 
x2 

其中給出:

> x2 
[1] "EV" "PIM" "WDR" "MYC" "OBX" "EV" "PIM" "WDR" "MYC" "OBX" "OBX" "MYC"