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

发布于 2024-08-18 06:43:39 字数 537 浏览 5 评论 0原文

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

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

如果我只有一行,那将非常有效,但是如何为数据框中的每一行执行此操作。我必须写一个for循环吗?有没有一种方法可以并行执行,类似于 pmax() 与 max() 的关系。

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

例子

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

成为

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

I have a guest list that has a last name in one column and then in another column I have the first names or the full names (first space last) of each person in the family. I am wanting to get the other column to just have the first names.

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

That would work perfectly if I just had one row but how do it do it for each row in the dataframe. Do I have to write a for loop? Is there a way to do it in parallel similarly to the way pmax() relates to max().

My problem is similar in a way to a previously asked question by JD Long but that question was a piece of cake compared to mine.

Example

:

Smith; Joe Smith, Kevin Smith, Jane Smith
Alter; Robert Alter, Mary Alter, Ronald Alter

Becomes

Smith; Joe, Kevin, Jane
Alter; Robert, Mary, Ronald

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

月棠 2024-08-25 06:43:39

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

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

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

You will probably need to clean up the spaces in your new vector.

落日海湾 2024-08-25 06:43:39

您可能需要对表达式进行一些“包装”以使 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.))}) 

you probably need to do some "wrapping" around your expression in order to get the apply() function working:

  • If your working on a data.frame you should use apply() (and not sapply())
  • you must create a function for apply (with a return clause)
  • working on data.frame line as function input is a bit tricky - they are converted into vectors and loose some properties (you can't use the $ sign to call named fields) so it's better to convert it first into a list

The final result looks something like this:

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.))}) 
北风几吹夏 2024-08-25 06:43:39

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

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

I am not sure it will work on a dataframe, but you could try one of the apply functions:

`y1 <- sapply(dataframe, gsub(guest.w$Last.Name,"",guest.w$Party.Name.s.))`
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文