【发布时间】:2018-08-29 02:52:20
【问题描述】:
假设我有一个像这样重复字母的向量:
x <- c("b b b b", "a a ")
我想删除重复的字符,以便每个向量只包含一个唯一的字符。输出如下所示:
"b", "a"
我找到了删除重复项的其他解决方案,但它们都涉及字符向量,而不是中间有空格的字符串。请问有什么建议吗?
【问题讨论】:
假设我有一个像这样重复字母的向量:
x <- c("b b b b", "a a ")
我想删除重复的字符,以便每个向量只包含一个唯一的字符。输出如下所示:
"b", "a"
我找到了删除重复项的其他解决方案,但它们都涉及字符向量,而不是中间有空格的字符串。请问有什么建议吗?
【问题讨论】:
这是一种使用sub 的基于正则表达式的方法。首先,我删除字符串中的所有空格。然后,我对以下模式进行替换:
(.)\\1{1,}
然后我替换为\\1。这里的逻辑是匹配并捕获单个字母,然后将其替换为单个字母,以及随后的任何 same 字母。这可以有效地满足您的需求。
x <- c("b b b b","a a ")
x <- gsub("\\s+", "", x)
result <- gsub("(.)\\1{1,}", "\\1", x)
result
[1] "b" "a"
【讨论】:
您可以执行以下操作。 R 具有内置常量letters。将x 分成单个字符,并在此基础上对letters 进行子集。
letters[letters %in% unlist(strsplit(x, ' '))]
[1] "a" "b"
【讨论】:
另一个在 R 中处理字符串的漂亮包是来自 tidyverse 的 stringr;
library(stringr)
x <- c("b b b b","a a ")
x <- str_replace_all(x, "\\s+", "")
unique(unlist(str_split(x, boundary("character"))))
#> [1] "b" "a"
首先删除所有多余的空格,然后将字符串拆分为字符。
这个解决方案有点冗长,但本质上与Tim Biegeleisen 的答案相同。虽然我认为对于像我这样的 regex 新手来说更容易理解。
【讨论】: