R在data.frame中得到双/三重桶姓氏的第一个字母

时间:2016-01-11 11:25:26

标签: regex r string strsplit

我有一个包含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

请注意第二个名称中的“ - ”。我有用空格和连字符分隔的姓氏。

我尝试过:

步骤1:

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

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

我的研究表明,我可以使用strtrim作为第2步,但我发现的所有方法都有很多方法。

2 个答案:

答案 0 :(得分:4)

您可以使用外观来定位行的空格,连字符和开头。例如,任何字符(.)之前没有行的开头,空格或连字符应替换为"":

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

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

第二个gsub用空格("")替换任何前面有非" ""-"字符的字符。

答案 1 :(得分:1)

如果输入数据中显示名称的格式,则可以尝试此操作:

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

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