【问题标题】:How do I keep only unique words within each string in a vector? I.e. remove ALL duplicates如何在向量中的每个字符串中只保留唯一的单词? IE。删除所有重复项
【发布时间】:2017-07-03 10:06:48
【问题描述】:

假设我的数据如下所示:

vector = c("Happiness with KK Happiness without KK", "I love some coding I love major coding", "fun 2 fun 3")

我想删除所有重复的单词,包括每个重复单词的第一个实例。所以,我的输出应该是这样的:

[1] "with without"
[2] "some major"
[3] "2 3"

基本上和这个问题类似:How do keep only unique words within each string in a vector。但是我不想保留重复单词的第一个实例。

我尝试使用strsplit() 以及" "duplicated() 将每个字符串拆分为不同的单词,然后检测重复项。

使用duplicated() 的问题在于它只返回重复单词的second 实例的逻辑向量。此外,使用strsplit() 以列表的形式给我输出,这确实使事情变得复杂,例如,当我想获得重复单词的子集时(通常像df[duplicated(df)] 这样的东西不适用于列表)。

【问题讨论】:

标签: r string text duplicates


【解决方案1】:

使用duplicated 来检查正向和反向利用fromLast=TRUE

lapply(strsplit(vector, "\\s+"), function(x) 
  x[!(duplicated(x) | duplicated(x,fromLast=TRUE))]  
)
#[[1]]
#[1] "with"    "without"
#
#[[2]]
#[1] "some"  "major"
#
#[[3]]
#[1] "2" "3"

【讨论】:

  • 并且,添加(也许可以添加为编辑?)用data.frame() 包装对lapply 的调用以返回数据框
  • @HFBrowning - 不是真的,不。如果每个列表项的长度不同,那么它不能只包裹在data.frame
  • 或者lapply(strsplit(vector, "\\s+"), function(x) x[ave(x, x, FUN = length)==1L])
【解决方案2】:

使用 tidytext 的文本挖掘方法:

library(dplyr)
library(tidytext)

data_frame(vector = c("Happiness with KK Happiness without KK","I love some coding I love major coding", "fun 2 fun 3"),
           id = seq_along(vector)) %>% 
    unnest_tokens(word, vector) %>% 
    count(id, word) %>% 
    filter(n == 1) %>% 
    summarise(vector = paste(word, collapse = ' '))

#> # A tibble: 3 × 2
#>      id       vector
#>   <int>        <chr>
#> 1     1 with without
#> 2     2   major some
#> 3     3          2 3

老实说,这可能有点矫枉过正,但这取决于你的大背景。

【讨论】:

    【解决方案3】:

    您也可以使用table函数获取频率并选择频率为1的唯一。

    sapply(strsplit(vector," "), function(x) names(table(x))[t(table(x))[1,] == 1])
    

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多