Объединить счетчики в классифицированном кадре данных с помощью регулярного выражения в group_by? - PullRequest
3 голосов
/ 12 апреля 2020

Я работаю с большим набором генетических данных. У каждого уникального «гена» есть «цепочки», то есть группы, которые мне нужно подсчитать. Однако я также хотел бы сократить столбец «gene» на более общие c группы, но сохранить категорию «chain» и объединить «count».

Я запустил следующее, чтобы изначально уменьшить данные:

df1 <- huge_dataset %>% 
  dplyr::group_by(gene) %>% 
  dplyr::count(chain, name="count")

, которые можно воспроизвести следующим образом:

df1 <- data.frame("gene"= c("IGHA1", "IGHA1", "IGHA2","IGHA2", "IGHG1", "IGHG1", "IGHG2", "IGHG2"),
               "chain"= c("IGK", "IGL","IGK", "IGL","IGK", "IGL", "IGK", "IGL"),
               "count" = c(30, 12, 18, 19, 57, 109, 62, 34))

Затем я хочу объединить записи в столбце «ген» по уникальности четвертой буквы, используя регулярное выражение (т.е. регулярное выражение - «IGH.») каждого гена, и объединить столбцы «count», но также сохранить категоризацию по столбцу «chain». В результате этого преобразования из df1:

df2 <- data.frame("gene"= c("IGHA", "IGHA", "IGHG", "IGHG"),
                 "chain"= c("IGK", "IGL","IGK", "IGL"),
                 "count" = c(48, 31, 119, 143))

Есть ли аккуратное / элегантное решение для

  1. Замените мой исходный оператор group_by () с помощью регулярного выражения или
  2. Уменьшить df1 до df2?

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

Ответы [ 4 ]

3 голосов
/ 12 апреля 2020

Использование базовых R aggregate:

aggregate(count~ gene + chain, 
          transform(df1, gene = sub('(.{4}).*', '\\1', gene)), sum)

#  gene chain count
#1 IGHA   IGK    48
#2 IGHG   IGK   119
#3 IGHA   IGL    31
#4 IGHG   IGL   143
3 голосов
/ 12 апреля 2020

Вы можете сделать:

df1 %>%
 group_by(gene = substr(gene, 1, 4), chain) %>%
 summarise(count = sum(count))

  gene  chain count
  <chr> <fct> <dbl>
1 IGHA  IGK      48
2 IGHA  IGL      31
3 IGHG  IGK     119
4 IGHG  IGL     143
2 голосов
/ 12 апреля 2020

Опция с использованием data.table

library(data.table)
setDT(df1)[ ,.(count = sum(count)), .(gene = substr(gene, 1, 4), chain)]
2 голосов
/ 12 апреля 2020

Подход, использующий count вместо group_by + summarise. Также. Насколько я понимаю, вы можете сделать вычисления непосредственно на huge_dataset:

library(dplyr)
library(stringr)
df1 %>%
  count(gene = stringr::str_extract(gene, "[A-Z]{4}"), chain, wt = count, name = "count")

# Or apply it directly on huge_dataset 
huge_dataset %>%
  count(gene = stringr::str_extract(gene, "[A-Z]{4}"), chain, name = "count")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...