Параллельный gsub: как удалить разные строки в каждом элементе вектора

У меня есть список гостей, в котором фамилия в одном столбце, а затем в другом столбце, у меня есть имена или полные имена (первый пробел в конце) каждого человека в семье. Я хочу, чтобы в другом столбце были только имена.

gsub(guest.w$Last.Name,"",guest.w$Party.Name.s.)

Это сработало бы отлично, если бы у меня была только одна строка, но как это сделать для каждой строки в фрейме данных. Должен ли я писать цикл for? Есть ли способ сделать это параллельно, аналогично тому, как pmax () относится к max ().

Моя проблема похожа на ранее заданный вопрос JD Long, но этот вопрос был проще простого по сравнению с моим.

Пример

:

Смит; Джо Смит, Кевин Смит, Джейн Смит и Альтер; Роберт Альтер, Мэри Альтер, Рональд Альтер

Становится

Смит; Джо, Кевин, Джейн
Альтер; Роберт, Мэри, Рональд


person Farrel    schedule 16.01.2010    source источник


Ответы (3)


Использование hadleys adply:

library(plyr)
df <- data.frame(rbind(c('Smith', 'Joe Smith, Kevin Smith, Jane Smith'), c('Alter', 'Robert Alter, Mary Alter, Ronald Alter')))
names(df) <- c("last", "name")
adply(df,1,transform, name=gsub(last, '', name))

Вероятно, вам нужно будет очистить пробелы в вашем новом векторе.

person Eduardo Leoni    schedule 16.01.2010

вам, вероятно, нужно "обернуть" свое выражение, чтобы функция apply () заработала:

  • Если вы работаете с data.frame, вы должны использовать apply () (а не sapply ())
  • вы должны создать функцию для применения (с предложением возврата)
  • работать со строкой data.frame в качестве ввода функции немного сложно - они преобразуются в векторы и теряют некоторые свойства (вы не можете использовать знак $ для вызова именованных полей), поэтому лучше сначала преобразовать его в список

Окончательный результат выглядит примерно так:

df <- rbind(c('Smith', 'Joe Smith, Kevin Smith, Jane Smith'), c('Alter', 'Robert Alter, Mary Alter, Ronald Alter'))
colnames(df) = c('Last.Name', 'Party.Name.s.')
apply(df,1,function(y) {y = as.list(y);return(gsub(y$Last.Name, "", y$Party.Name.s.))}) 
person Izzy    schedule 21.01.2010

Я не уверен, что он будет работать с фреймворком данных, но вы можете попробовать одну из функций apply:

`y1 <- sapply(dataframe, gsub(guest.w$Last.Name,"",guest.w$Party.Name.s.))`
person twolfe18    schedule 16.01.2010
comment
sapply (guest.w, gsub (guest.w $ Last.Name ,, guest.w $ Party.Name.s.)) Нет. Я пробовал эту ошибку в match.fun (FUN): 'gsub (guest.w $ Last.Name`` guest.w $ Party.Name.s.) 'Не является функцией, символом или символом Дополнительно: Предупреждение: в gsub (guest.w $ Last.Name`` guest.w $ Party.Name .s.): аргумент 'шаблон' имеет длину ›1, и будет использоваться только первый элемент - person Farrel; 17.01.2010