Параллельный gsub: как удалить отдельную строку в каждом элементе вектора - PullRequest
1 голос
/ 17 января 2010

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

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

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

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

Пример

:

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

Становится

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

Ответы [ 3 ]

1 голос
/ 17 января 2010

Использование 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))

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

0 голосов
/ 21 января 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.))}) 
0 голосов
/ 17 января 2010

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

`y1 <- sapply(dataframe, gsub(guest.w$Last.Name,"",guest.w$Party.Name.s.))`
...