r - 如果字符串匹配另一个字符串的一部分,则替换字符串
问题描述
我有一列人的姓氏和他们的首字母,在某些情况下,一个人可能会被列出两次,一次是一个首字母(例如 SMITH C),一次是两个首字母(例如 SMITH CD),我想替换所有实例SMITH CD 与 SMITH C.
一个例子
df <- data.frame(
id = 1:7,
names = c("JOHN S", "JOHN SW", "JOHNSON S",
"SMITH C", "SMITH WC", "SMITH CD",
"HANK K"))
> df
id names
1 1 JOHN S
2 2 JOHN SW
3 3 JOHNSON S
4 4 SMITH C
5 5 SMITH WC
6 6 SMITH CD
7 7 HANK K
我可以为单个名称手动执行此操作,例如:
df$names <- gsub("SMITH CD", "SMITH C", df$names)
> df
id names
1 1 JOHN S
2 2 JOHN SW
3 3 JOHNSON S
4 4 SMITH C
5 5 SMITH WC
6 6 SMITH C
7 7 HANK K
但我的真实数据集包含约 4000 个名称,因此我希望能够:
- 以编程方式识别姓氏和第一个初始匹配的情况,以及
- 一次性完成所有更换
对于上面的小例子 df ,结果将是:
> df
id names
1 1 JOHN S
2 2 JOHN S
3 3 JOHNSON S
4 4 SMITH C
5 5 SMITH WC
6 6 SMITH C
7 7 HANK K
任何帮助将非常感激。
解决方案
当有两个字母单词时,通过删除末尾的字母创建分组列,然后names
通过选择具有最少字符数的元素来修改
library(dplyr)
library(stringr)
df %>%
group_by(grp = str_remove(names, "(?<= [A-Z])[A-Z]$")) %>%
mutate(names = names[which.min(nchar(names))]) %>%
ungroup %>%
select(-grp)
-输出
# A tibble: 7 x 2
# id names
# <int> <chr>
#1 1 JOHN S
#2 2 JOHN S
#3 3 JOHNSON S
#4 4 SMITH C
#5 5 SMITH WC
#6 6 SMITH C
#7 7 HANK K
推荐阅读
- c# - 像 Ping 一样检查 Socks5 RoundtripTime 的方法
- php - 如何使用 composer 的版本安装 Symfony?
- python - 在 Numba @jitclass 中使用列表
- c# - .NET Core 2.1 管理会话变量
- python-3.x - 在 Django Rest Framework 的 View 类中访问自定义 HTTP 标头的常用方法
- java - 如何创建一个接受符号的构造函数,例如:*、+、()等
- python - 安装没有 pip/easy_install 或“python setup.py install”的模块
- php - 如何在 PHP 中将父子平表记录显示为嵌套列表?
- javascript - 如何从 SQL 查询数据中实现 EXT JS 存储树列表
- c++ - 如何在.cpp中实现属于非模板类的模板函数