1

我有一个来宾列表,其中有一列中有姓氏,然后在另一列中,我有家庭中每个人的名字或全名(第一个空格最后)。我想让另一列只有名字。

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

如果我只有一行,那将非常有效,但是如何为数据框中的每一行做到这一点。我必须写一个for循环吗?有没有办法与 pmax() 与 max() 的关联方式类似地并行执行它。

我的问题在某种程度上类似于JD Long 之前提出的问题,但与我的问题相比,这个问题是小菜一碟。

例子

史密斯; 乔·史密斯、凯文·史密斯、简·史密斯·
奥尔特;罗伯特·阿尔特、玛丽·阿尔特、罗纳德·阿尔特

变成

史密斯; 乔、凯文、简·
阿尔特;罗伯特、玛丽、罗纳德

4

3 回答 3

1

使用 hadleys 应用:

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

您可能需要清理新向量中的空间。

于 2010-01-16T22:39:51.227 回答
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.))}) 
于 2010-01-21T09:49:42.663 回答
-2

我不确定它是否适用于数据框,但您可以尝试以下应用功能之一:

`y1 <- sapply(dataframe, gsub(guest.w$Last.Name,"",guest.w$Party.Name.s.))`
于 2010-01-16T21:50:21.450 回答