Объединить таблицу по нескольким столбцам в r - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь объединить (консолидировать) таблицу, полученную в результате использования rbind для объединения нескольких фреймов данных. Мне нужно объединить строки с одинаковыми значениями в нескольких столбцах и суммировать их количество.

Для упрощения я показываю образец таблицы.

    count  freq   cdr3nt        cdr3aa    v          d     j       VEnd DStart  DEnd  JStart
 1. 5344   0.160  TGGGTCAACTAA  CASSQRD   TRBV14    TRBD1  TRBJ2-1  18    -1     18     27  
 2. 245    0.022  TGGACTAATCAG  CAQSTRTT  TRBV27-1  TRBD2  TRBJ2-5  12    17     -1     19
 3. 120    0.010  TAGGGAGGC     CASTT     TRBV7-2   TRBD1  TRBJ1-5  10    19     -1     34
 4. 102    0.010  TGGACTAATCAG  CAQSTRTT  TRBV27-1  TRBD2  TRBJ2-5  12    17     -1     19
 5. 52     0.001  TGGGTCAACTAA  CASSQRD   TRBV14    TRBD1  TRBJ2-1  18    -1     18     27
 6. 51     0.001  TGCGGGAA      CGSSST    TRBV4-3   TRBD2  TRBJ1-3  27    10     26     24      

Если столбцы для cdr3nt, cdr3aa, v, d, j, VEnd, DStart, DEnd и JStart имеют одинаковые значения, значения счетчиков для этих столбцов должны суммироваться, и только одна строка должна отображаться с информацией. Кроме того, мне нужно будет пересчитать значения частоты для строк, объединенных, путем деления результирующего числа на общую сумму значений для таблицы. Получившаяся таблица должна выглядеть следующим образом:

 count  freq   cdr3nt        cdr3aa    v          d     j       VEnd DStart  DEnd  JStart
 5396   0.18  TGGGTCAACTAA  CASSQRD   TRBV14    TRBD1  TRBJ2-1  18    -1     18     27  
 347    0.034 TGGACTAATCAG  CAQSTRTT  TRBV27-1  TRBD2  TRBJ2-5  12    17     -1     19
 120    0.010 TAGGGAGGC     CASTT     TRBV7-2   TRBD1  TRBJ1-5  10    19     -1     34
 51     0.001 TGCGGGAA      CGSSST    TRBV4-3   TRBD2  TRBJ1-3  27    10     26     24

Строки 1. и 5. были объединены, а также строки 2. и 4. Их количество было добавлено, и частота была пересчитана. В реальной версии может быть более двух строк с одинаковыми значениями.

Я начал со следующего фрагмента кода, пытаясь использовать агрегатную функцию, но сразу столкнулся с проблемами. Я даже не удосужился сделать новый расчет частоты.

 samrep1 <- read.table("/Data/tables_merge/JB-3_R1.txt", header=TRUE, sep="\t")
 samrep2 <- read.table("/Data/tables_merge/JB-3_R2.txt", header=TRUE, sep="\t")
 samrep3 <- read.table("/Data/tables_merge/JB-3_R3.txt", header=TRUE, sep="\t")
 samrep4 <- read.table("/Data/tables_merge/JB-3_R4.txt", header=TRUE, sep="\t")

 table2 <- rbind(samrep1, samrep2)
 table3  <- rbind(table2, samrep3)
 table4 <- rbind(table3, samrep4)

 agg_table <- aggregate(table4, by=list(table4$cdr3nt), FUN = sum)

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

3 голосов
/ 28 января 2020

Вместо создания нескольких объектов в глобальном окружении, мы можем прочитать его в list

library(dplyr)
library(purrr)
out <- list.files(path = "/Data/tables_merge", pattern = "^JB-\\d+_R\\d+\\.txt",
           full.names = TRUE) %>%
       map_dfr(read.table, header = TRUE, sep="\t") %>%
        group_by(cdr3nt, cdr3aa, v, d, j, VEnd, DStart, DEnd, JStart) %>%
        summarise(Count = sum(count), freq = Count/sum(.$count))
2 голосов
/ 28 января 2020

Рассмотрим версию формулы aggregate, заключенную в within для freq Расчет:

final_df <- do.call(rbind, list(samrep1, samrep2, samrep3, samrep4))

agg_df <- within(aggregate(count ~ cdr3nt + cdr3aa + v + d + j + VEnd + DStart + DEnd + JStart, 
                           data = final_df, 
                           FUN = length),
                 freq <- count / sum(count)
          )

Онлайн-демонстрация

2 голосов
/ 28 января 2020

Это должно быть возможно с пакетом dplyr и функцией group_by, summarize, где суммирование суммирует значения.

library(dplyr)

dta %>% mutate(total = sum(count)) %>% 
group_by(cdr3nt, cdr3aa, v, d, j, VEnd, DStart, DEnd, JStart) %>%
summarize(count_new = sum(count), freq = count_new/mean(total))
...