我有一个包含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步,但我发现的所有方法都有很多方法。
答案 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
如果名称的格式有些不一致,则需要修改上述模式以捕获它。您可以在模式中使用|, &
运算符来组合多个模式。