Объединить строки с частично дублированной информацией

#r

#r

Вопрос:

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

 data.frame(chr=c(3,3,3,1,1),start=c(15,52,17,1,80),end=c(52,68,18,15,92),strand=c(" "," "," ","-","-"),item=c("A","A","B","C","C"))
        chr start end strand item
1        3    15  52            A
2        3    52  68            A
3        3    17  18            B
4        1     1  15      -     C
5        1    80  92      -     C
  

Элементы A и C могут иметь два или более разных начала и окончания, но остальные столбцы одинаковы внутри каждой группы. Есть ли способ объединить начальную и конечную информацию таким образом?

         chr start   end strand item
1        3 15,52 52,68            A
2        3    17    18            B
3        1  1,80 15,92      -     C
  

Спасибо за вашу помощь!

Ответ №1:

Мы можем группировать по значениям ‘chr’, ‘strand’, ‘item’ и paste ‘start’, ‘end’ с toString помощью (=> paste(., collapse=", ") )

 library(dplyr)
df1 %>%
    group_by(chr, strand, item) %>% 
    summarise(across(c(start, end), toString), .groups = 'drop') %>%
    arrange(item)
  

-вывод

 # A tibble: 3 x 5
#    chr strand item  start  end   
#  <dbl> <chr>  <chr> <chr>  <chr> 
#1     3        A     15, 52 52, 68
#2     3        B     17     18    
#3     1 -      C     1, 80  15, 92
  

Или base R с помощью aggregate

 aggregate(cbind(start, end) ~ ., df1, toString)