并行gsub:如何在向量的每个元素中删除不同的字符串

时间:2010-01-16 21:19:36

标签: r replace gsub

我有一个访客列表,在一列中有一个姓氏,然后在另一列中我有一个姓氏或全家每个人的全名(最后一个空格)。我想让其他专栏只有名字。

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

如果我只有一行但是如何为数据帧中的每一行做这件事,那将会很有效。我必须写一个for循环吗?有没有办法与pmax()与max()相关的方式并行执行。

我的问题与previously asked question by JD Long类似,但与我的问题相比,这个问题是件小事。

实施例

史密斯;乔史密斯,凯文史密斯,简史密斯 改变; Robert Alter,Mary Alter,Ronald Alter

变为

史密斯;乔,凯文,简
改变;罗伯特,玛丽,罗纳德

3 个答案:

答案 0 :(得分:1)

使用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))

您可能需要清理新矢量中的空格。

答案 1 :(得分:0)

为了让apply()函数正常工作,你可能需要在表达式周围做一些“包装”:

  • 如果你在data.frame上工作,你应该使用apply()(而不是sapply())
  • 您必须创建一个apply函数(带有return子句)
  • 使用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.))}) 

答案 2 :(得分:-2)

我不确定它是否适用于数据帧,但您可以尝试使用其中一个应用函数:

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