R: Замена имен строк фрейма данных подстрокой [2] - PullRequest
2 голосов
/ 09 июня 2011

У меня есть вопрос об использовании 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 ), не распознает |персонажи.У меня вопрос, есть ли другой способ получить то же решение без использования этого??

Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

I не будет рекомендовать делать это в целом в R, поскольку оно гораздо менее эффективно, чем решение @csgillespie, но альтернативой является циклическое переключение различных строк, которые вы хотите сопоставить и выполнить замены для каждой строки отдельно, т. е. искать "MYN" и заменять только в тех именах строк, которые соответствуют "MYN".

Вот пример использования x данных из @ 1010 * @ssgillespie's answer :

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"
2 голосов
/ 09 июня 2011

Если вы не хотите использовать «|» персонаж, вы можете попробовать что-то вроде:

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"

Но я бы серьезно подумал упомянуть об этом команде галактики, так как было бы довольно неловко не использовать символ для ИЛИ ...

...