我想知道是否有可能做这个缩写?
t <- "CERVANTES CASA,JORGE LUIS"
期望的结果是:
CERVANTES, JL
方法:
> sub("\\s.+,", ", ", t)
[1] "CERVANTES, JORGE LUIS"
我的问题是,由于我有很长的名单,如何让替换返回最后两个名字的第一个字母?考虑到字符从一个字符串到另一个字符串是不同的。例: 对于“JORGE”,J;对于LUIS,“L”。
答案 0 :(得分:3)
使用
> library(stringr)
> t <- "CERVANTES CASA,JORGE ANTONIO"
> str_replace_all(t, "\\s[^,]*,\\s*(\\p{L})\\p{L}*(?:\\s+(\\p{L})\\p{L}*)?$", ", \\1\\2")
[1] "CERVANTES, JA"
正则表达式匹配
\\s
- 一个空格,然后[^,]*
- 除,
以外的0 +字符,然后,
- 逗号,\\s*
- 再次0+空格,(\\p{L})
- 捕获一封信然后\\p{L}*
- 匹配单词的其余部分,然后(?:\\s+(\\p{L})\\p{L}*)?
- 匹配以下可选序列:
\\s+
- 1+空格,(\\p{L})
- 另一封信(被捕获到第2组)然后\\p{L}*
- 直到字符串末尾的0+个字母。我不确定这是OP需要的。$
- 字符串结尾替换模式:
,
- 逗号和空格\\1\\2
- 对第1组和第2组的两个反向引用,插入与2组匹配的内容。答案 1 :(得分:1)
您可以按照以下步骤在数据框中获取所需的缩写:
第一:数据样本:
Name<- as.data.frame(("CERVANTES CASA,JORGE ANTONIO"))
colnames(Name)<-"Name"
第二:将名称分为两列(逗号是分隔符):
df2<-as.data.frame(str_split_fixed(Name$Name, ",", 2))
colnames(df2)<-c("Last_Name", "Name")
第三:提取姓氏的第一个字:
df2$First_LastName <- gsub("([A-Za-z]+).*", "\\1", df2$Last_Name)
第四:从姓名中提取第一个字母:
df2$First_Letter_Name<- substr(df2$Name, 1, 1)
在一栏中加入所需的单词:
df2$desired <- paste(df2$First_Last_Name,",",df2$First_Letter_Name )
output in new column: CERVANTES , J