2011-06-09 78 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"