2016-12-20 8 views
2

У меня есть кадр данных в формате:удалить соседние дубликаты в г

site_domain <- c('ebay.com','facebook.com','facebook.com','ebay.com','ebay.com','auto.com','ebay.com','facebook.com','auto.com','ebay.com','facebook.com','facebook.com','ebay.com','facebook.com','auto.com','auto.com') 
id <- c(1, 1, 1,2,2,3,3,3,3,4,4,4,5,5,5,5) 
file0 <- as.data.frame(cbind(site_domain,id)) 

Я сделал группу, на «ID», чтобы получить данные:

library(dplyr) 
xx <- as.data.frame(file0 %>% 
         group_by(id) %>% 
         summarise(pages=paste(site_domain, collapse='_'))) 

Данные выглядит следующим образом:

1 ebay.com_facebook.com_facebook.com 
2 ebay.com_ebay.com 
3 auto.com_ebay.com_facebook.com_auto.com 
4 ebay.com_facebook.com_facebook.com 
5 ebay.com_facebook.com_auto.com_auto.com 

Однако я хочу, чтобы удалить соседние дубликаты, поэтому я хочу из положить, как:

1 ebay.com_facebook.com 
2 ebay.com 
3 auto.com_ebay.com_facebook.com_auto.com 
4 ebay.com_facebook.com 
5 ebay.com_facebook.com_auto.com 

Как я могу достичь этого.

ответ

2

Мы можем использовать values свойство rle для удаления соседних дубликатов.

library(dplyr) 
file0 %>% 
    group_by(id) %>% 
    summarise(pages=paste(rle(as.character(site_domain))$values, collapse='_')) 

#  id         pages 
# <fctr>         <chr> 
#1  1     ebay.com_facebook.com 
#2  2        ebay.com 
#3  3 auto.com_ebay.com_facebook.com_auto.com 
#4  4     ebay.com_facebook.com 
#5  5   ebay.com_facebook.com_auto.com 
1

С unique функции:

xx <- as.data.frame(file0 %>% 
         group_by(id) %>% 
         summarise(pages=paste(unique(site_domain), collapse='_'))) 

xx 

# id       pages 
#1 1   ebay.com_facebook.com 
#2 2      ebay.com 
#3 3 auto.com_ebay.com_facebook.com 
#4 4   ebay.com_facebook.com 
#5 5 ebay.com_facebook.com_auto.com      
+0

это выглядит хорошо, однако я вижу в третьей строке: вывод должен быть 'auto.com_ebay.com_facebook.com_auto.com', но этот подход дает:' aut o.com_ebay.com_facebook.com' .. любая помощь, как мы можем изменить это. – PSraj

+0

Да, возможно, я обновлю ответ с новым подходом – OdeToMyFiddle

1

легко удалить дублирование до группировки

 file0 <- file0 [!duplicated(file0),] 


     site_domain id 
     1  ebay.com 1 
     2 facebook.com 1 
     4  ebay.com 2 
     6  auto.com 3 
     7  ebay.com 3 
     8 facebook.com 3 
     10  ebay.com 4 
     11 facebook.com 4 
     13  ebay.com 5 
     14 facebook.com 5 
     15  auto.com 5 

, то вы можете сгруппировать данные по идентификатору

  id       pages 
      1 1   ebay.com_facebook.com 
      2 2      ebay.com 
      3 3 auto.com_ebay.com_facebook.com 
      4 4   ebay.com_facebook.com 
      5 5 ebay.com_facebook.com_auto.com 
+0

, это тоже близко, но выход должен быть: 'auto.com_ebay.com_facebook.com_auto.com', но этот подход тоже дает:' auto.com_ebay.com_facebook.com'. любая помощь, как мы можем изменить это – PSraj

2

Вот вариант с data.table

library(data.table) 
setDT(file0)[, unique(site_domain), by= .(id, grp=rleid(site_domain)) 
      ][, .(site=paste(V1, collapse="_")) , id] 
# id         site 
#1: 1     ebay.com_facebook.com 
#2: 2        ebay.com 
#3: 3 auto.com_ebay.com_facebook.com_auto.com 
#4: 4     ebay.com_facebook.com 
#5: 5   ebay.com_facebook.com_auto.com 

Или создать индекс с .I, извлекать строки и paste по 'ид'

i1 <- setDT(file0)[, .I[!duplicated(site_domain)], .(id, grp = rleid(site_domain))]$V1 
file0[i1, .(site = paste(site_domain, collapse="_")), by = id]