R:用子串替换数据帧的rownames [2]

时间:2011-06-09 10:23:13

标签: r dataframe gsub galaxy

我对gsub的使用有疑问。我的数据的rownames具有相同的部分名称。见下文:

> 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)运行的程序无法识别|字符。我的问题是,有没有另一种方法可以使用相同的解决方案而不使用这个|?

谢谢!

2 个答案:

答案 0 :(得分: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"

但是我会认真考虑向银河系团队提及这一点,因为似乎不能将符号用于OR ......

答案 1 :(得分: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的{​​{1}}元素的逻辑指示符
  3. 然后我们使用与您已经显示的相同的样式i调用,但仅使用与该字符串匹配的gsub()元素,并仅替换这些元素。
  4. 循环是:

    x2

    给出了:

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