2

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

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

在我之前的问题中,我问是否有办法为相同的部分名称获取相同的名称。看到这个问题:用子字符串替换数据框的行名

答案是一个非常好的解决方案。函数 gsub 就是这样使用的:

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

现在,我遇到了另一个问题,我使用 R ( Galaxy ) 运行的程序无法识别 | 人物。我的问题是,是否有另一种方法可以在不使用此 | 的情况下获得相同的解决方案?

谢谢!

4

2 回答 2

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 符号似乎很尴尬......

于 2011-06-09T11:06:17.777 回答
2

我一般建议在 R 中执行此操作,因为它的效率远低于@csgillespie 提供的解决方案,但另一种方法是循环遍历要匹配的各种字符串并分别对每个字符串进行替换,即搜索"MYN"并且只替换那些匹配的行名"MYN"

这是使用x来自@csgillespie 的答案的数据的示例:

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()的那些元素返回一个逻辑指示符x2i
  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"
于 2011-06-09T11:06:48.613 回答