2016-12-08 2 views
1

Я пытаюсь использовать gsub для удаления слов/текста в столбце y, которые находятся в столбце x.R gsub удалить слова в столбце y из слов в столбце x

x = c("a","b","c") 
y = c("asometext", "some, a b text", "c a text") 
df = cbind(x,y) 
df = data.frame(df) 
df$y = gsub(df$x, "", df$y) 

Если я запускаю код, указанный выше, он удаляет только текст из колонки х строки 1, а не все строки:

> df 
    x    y 
1 a  sometext 
2 b some, b text 
3 c  c text 

Я хочу, чтобы конечный результат будет:

> df 
    x    y 
1 a  sometext 
2 b  some, text 
3 c  text 

Итак, все слова/буквы из столбца x должны быть удалены из столбца y. Возможно ли это с помощью gsub?

+0

'df $ y <- mapply (gsub, df $ x," ", df $ y)' может работать –

ответ

1

Обычно gsub принимает три аргумента 1) шаблон, 2) замену и 3) вектор для замены значений.

Шаблон должен быть одной строкой. И то же самое для замены. Единственной частью функции, открытой для нескольких значений, является вектор. Из-за этого мы называем это векторизованным.

gsub(df$x, "", df$y) #doesn't work because 'df$x' isn't one string 

Узор аргумент не векторизации, но мы можем использовать mapply для выполнения этой задачи.

mapply и GSUB (BFFs)

x = c("a","b","c") 
y = c("asometext", "some, a b text", "c a text") 
repl = "" 

#We do 
mapply(gsub, x, repl, y) 

#On the inside 
gsub(x[[1]], repl[[1]], y[[1]]) 
gsub(x[[2]], repl[[2]], y[[2]]) 
gsub(x[[3]], repl[[3]], y[[3]]) 

Вы можете спросить, но у меня есть только один repl, как же repl[[2]] и repl[[3]] работу? Функция заметила, что для нас и повторяется «repl», пока она не сравняется с длиной остальных.

+0

Привет! это работает, но только удаляет x из одной и той же строки, поэтому, если строка номер 2 в столбце y содержит «b», а строка 1 в столбце x содержит «b», то она не будет удалена. Есть ли решение для этого? – Aanna

+0

Попробуйте 'gsub (paste (df $ x, collapse =" | ")," ", df $ y)' –

+0

Спасибо! это именно то, что я искал! – Aanna

Смежные вопросы