如何在向量中的每个字符串中只保留唯一的单词
Posted
技术标签:
【中文标题】如何在向量中的每个字符串中只保留唯一的单词【英文标题】:How do keep only unique words within each string in a vector 【发布时间】:2015-03-17 23:18:19 【问题描述】:我的数据如下所示:
vector = c("hello I like to code hello","Coding is fun", "fun fun fun")
我想删除重复的单词(空格分隔),即输出应该是这样的
vector_cleaned
[1] "hello I like to code"
[2] "coding is fun"
[3] "fun"
【问题讨论】:
【参考方案1】:拆分(strsplit
空格),使用unique
(lapply
),然后将paste
重新组合在一起:
vapply(lapply(strsplit(vector, " "), unique), paste, character(1L), collapse = " ")
# [1] "hello i like to code" "coding is fun" "fun"
## OR
vapply(strsplit(vector, " "), function(x) paste(unique(x), collapse = " "), character(1L))
基于 cmets 更新
您始终可以编写一个自定义函数来与您的vapply
函数一起使用。例如,这里有一个函数,它接受一个拆分字符串,删除短于特定字符数的字符串,并将“唯一”设置作为用户选择。
myFun <- function(x, minLen = 3, onlyUnique = TRUE)
a <- if (isTRUE(onlyUnique)) unique(x) else x
paste(a[nchar(a) > minLen], collapse = " ")
比较下面的输出,看看它是如何工作的。
vapply(strsplit(vector, " "), myFun, character(1L))
vapply(strsplit(vector, " "), myFun, character(1L), onlyUnique = FALSE)
vapply(strsplit(vector, " "), myFun, character(1L), minLen = 0)
【讨论】:
我可以应用相同的技术来删除拆分字符串中少于 3 个字符的任何单词吗? @shecode,方法类似,但您必须根据nchar
的结果再添加一项要求(这将计算字符串中的字符数)。现在在我的手机上,所以我无法显示代码,但我会尝试稍后更新。理想情况下,如果我这样做,问题也应该更新。
谢谢。我根据您的答案的结构弄清楚了如何做到这一点。很有用【参考方案2】:
我花了一段时间寻找一个数据框,它对 tidyverse 友好的版本,所以我想我会粘贴我的详细解决方案:
library(tidyverse)
df <- data.frame(vector = c("hello I like to code hello",
"Coding is fun",
"fun fun fun"))
df %>%
mutate(split = str_split(vector, " ")) %>% # split
mutate(split = map(.$split, ~ unique(.x))) %>% # drop duplicates
mutate(split = map_chr(.$split, ~paste(.x, collapse = " "))) # recombine
结果:
#> vector split
#> 1 hello I like to code hello hello I like to code
#> 2 Coding is fun Coding is fun
#> 3 fun fun fun fun
由reprex package (v0.3.0) 于 2021-01-03 创建
【讨论】:
以上是关于如何在向量中的每个字符串中只保留唯一的单词的主要内容,如果未能解决你的问题,请参考以下文章