R 获取 data.frame 中 double/tripple-barrel 个姓氏的首字母

R get first letters of double/tripple-barrel surnames in data.frame

我有一个包含 2 列的数据框:

> df1
      Surname      Name
1 The Builder       Bob
2 Zeta-Jones Catherine

我想添加第三列"Shortened_Surname",其中包含姓氏字段中所有单词的首字母:

      Surname      Name Shortened_Surname
1 The Builder       Bob                TB
2  Zeta-Jones Catherine                ZJ

注意第二个名字中的“-”。我用 空格和连字符 .

分隔成桶形姓氏

我试过了:

第一步:

> strsplit(unlist(as.character(df1$Surname))," ")
[[1]]
[1] "The"     "Builder"

[[2]]
[1] "Zeta-Jones"

我的研究表明我可以使用 strtrim 作为第 2 步,但我发现有很多方法可以避免这样做。

您可以使用环视定位 space、连字符和行首。例如,任何字符 (.) 前面没有行首、space 或连字符都应替换为“”:

with(df, gsub("(?<!^|[ -]).", "", Surname, perl=TRUE))
[1] "TB" "ZJ"

with(df, gsub("(?<=[^ -]).", "", Surname, perl=TRUE))

第二个 gsub 将空格 ("") 替换为前面不是 " ""-" 的任何字符。

你可以试试这个,如果名称的格式如输入数据所示:

library(stringr)
df$Shortened_Surname <- sapply(str_extract_all(df$Surname, '[A-Z]{1}'), function(x) paste(x, collapse = ''))

输出如下:

      Surname      Name Shortened_Surname
1 The Builder       Bob                TB
2  Zeta-Jones Catherine                ZJ

如果名称的格式有些不一致,您需要修改上面的模式来捕捉。您可以在模式内使用 |, & 运算符来组合多个模式。