a, удалить дубликат на основе элементов в символьном векторе

#r #dplyr

#r #dplyr

Вопрос:

У меня есть фрейм данных, подобный этому, он содержит 3 или более символов, разделенных запятой (,), я хочу удалить строку, если она содержит одинаковые символы.

 x <-c(1,2,3,4,5)
y <-c("a,a,a","a,a,b,c","b,c,a","b,b,b,b","a,b,b,c")
df<-data.frame(x,y)
 

желаемый результат

 x <-c(2,3,5)
y <-c("a,a,b,c","b,c,a","a,b,b,c")
df<-data.frame(x,y)
 

Комментарии:

1. Кто-то может помочь вам достичь желаемого результата

Ответ №1:

Вы можете использовать separate_rows для разделения значений, разделенных запятыми, на разные строки, удалить те группы, в которых есть только 1 отдельное значение, и снова суммировать данные.

 library(dplyr)

df %>%
  tidyr::separate_rows(y) %>%
  group_by(x) %>%
  filter(n_distinct(y) > 1) %>%
  summarise(y = toString(y))

#      x y      
#  <dbl> <chr>  
#1     2 a, b, c
#2     3 b, c, a
#3     5 a, b, c
 

В базе R :

 df[sapply(strsplit(df$y, ','), function(x) length(unique(x))) > 1, ]
 

Комментарии:

1. Я понятия не имею о части «В базе R»

2. Я обновил вопрос, потому что он может содержать один и тот же элемент, но не все. итак, у вас есть какие-либо идеи ?. на самом деле это моя вина.

3. В моем ответе хранятся только те строки, в которых у вас более 1 уникального символа. Итак, мой ответ по-прежнему работает для вашего обновленного набора данных и дает ожидаемый результат.

4. @Isuru 1) Мой код выдает желаемый результат, как показано в вашем сообщении. Если вы этого не хотите, пожалуйста, приведите нам лучший пример, который представляет вашу реальную проблему. 2) Вы несете ответственность за то, чтобы пример, которым вы делитесь, точно отображал имеющиеся у вас данные, чтобы избежать ситуаций, когда ответ работает с образцами данных, которыми вы делитесь, но не с вашими фактическими данными. 3) Вы не должны изменять свой вопрос после публикации ответа или расширять его в комментариях. Если у вас есть дополнительные вопросы, задайте их как новый вопрос.

5. Вы должны включить пример, показывающий это. В этом случае вы можете создать столбец с номером строки. df %>% group_by(row = row_number()) %>% tidyr::separate_rows(y) %>% group_by(row) %>% filter(n_distinct(y) > 1) %>% summarise(y = toString(y))