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
в коде):
- Создайте регулярное выражение, вставив текущую строку совпадения
i
с другими битами регулярного выражения, которое мы хотим использовать,
- Используя
grepl()
, мы возвращаем логический индикатор для тех элементов x2
, которые содержат строку i
- Затем мы используем тот же стиль
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"