2017-02-14 12 views
1

Допустим, мои данные выглядит следующим образом:Как сохранить только уникальные слова в каждой строке в векторе? То есть удалить все дубликаты

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() заключается в том, что он возвращает только логический вектор второй экземпляр дублирующего слова. Кроме того, использование strsplit() дает мне результат в виде списка, что действительно усложняет ситуацию, например, когда я хочу получить подмножество повторяющихся слов (обычно что-то вроде df[duplicated(df)], которое не работает в списках).

+0

связанные: http://stackoverflow.com/questions/7854433/finding-all-duplicate-rows -including-elements-with-small-subscripts – dww

ответ

5

Используйте 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" 
+0

И, чтобы добавить (возможно, добавить в качестве редактирования?) оберните вызов 'lapply' с' data.frame() ', чтобы вернуть фрейм данных – HFBrowning

+0

@HFBrowning - не совсем, нет. Если длина каждого элемента списка отличается, то его нельзя просто обернуть в 'data.frame' – thelatemail

+0

Ох - хороший звонок. Derp – HFBrowning

3

Текстовая добыча подход с 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 

Возможно излишеством, если честно, но это зависит от вашего больший контекст.

1

Вы также можете использовать table функцию, чтобы получить частоту и выбрать только те, у которых частота 1.

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