Как подсчитать количество экземпляров значения в столбце по всем строкам? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть таблица, которая выглядит следующим образом:

> dt
                      variant_id          transcript_id is_NL individual counts 
        1: chr1_10007059_A_G_b38 chr1_10033695_10072027     0 GTEX-111FC     44     
        2: chr1_10007059_A_G_b38 chr1_10033695_10072027     0 GTEX-111VG     32     
        3: chr1_10007059_A_G_b38 chr1_10033695_10072027     0 GTEX-1122O     34     
        4: chr1_10007059_A_G_b38 chr1_10033695_10072027     0 GTEX-113IC     17     
        5: chr1_10007059_A_G_b38 chr1_10033695_10072027     0 GTEX-113JC     37     
       ---                                                                           
159899076: chr9_92815645_A_C_b38 chr9_92535983_92536600     1  GTEX-X4XX      1     
159899077: chr9_92815645_A_C_b38 chr9_92535983_92536600     1  GTEX-XBEW      3     
159899078: chr9_92815645_A_C_b38 chr9_92535983_92536600     1  GTEX-Y5V6      0     
159899079: chr9_92815645_A_C_b38 chr9_92535983_92536600     1  GTEX-YEC4      0     
159899080: chr9_92815645_A_C_b38 chr9_92535983_92536600     1  GTEX-ZYY3      0     

Существует ~ 600 уникальных individual с, и каждая variant_id и transcript_id пара присутствует в каждый человек (по крайней мере, в таблице, количество может быть 0).

Что я хочу сделать для каждой пары variant_id и transcript_id, найти количество экземпляров, где counts == 0 и counts > 0 за каждый is_NL == 0, 1, 2.

Ниже приведен макет таблицы (0 == HH, 1 == HN, 2 == NN)

variant_id     transcript_id     HH=0    HH>0    HN=0    HN>0    NN=0    NN>0
a              b                 2       1146    3571    3312    741     280
...

et c. Я надеюсь, что это имеет смысл.

Для дальнейшего описания каждая строка представляет count из transcript, обнаруженных в каждом individual, учитывая вариант сращивания в variant_id. is_NL представляет генотип человека, где 0 означает гомозиготный по аллелю человека, 2 означает гомозиготный по аллелю неандертальца, а 1 означает гетерозиготный.

structure(list(variant_id = c("chr1_10007059_A_G_b38", "chr1_10007059_A_G_b38", 
"chr1_10007059_A_G_b38", "chr1_10007059_A_G_b38", "chr1_10007059_A_G_b38", 
"chr1_10007059_A_G_b38"), transcript_id = c("chr1_10033695_10072027", 
"chr1_10033695_10072027", "chr1_10033695_10072027", "chr1_10033695_10072027", 
"chr1_10033695_10072027", "chr1_10033695_10072027"), is_NL = c(0L, 
0L, 0L, 0L, 0L, 0L), individual = c("GTEX-111FC", "GTEX-111VG", 
"GTEX-1122O", "GTEX-113IC", "GTEX-113JC", "GTEX-117XS"), counts = c(44L, 
32L, 34L, 17L, 37L, 32L), nrows = c(1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 
6L), class = "data.frame")

1 Ответ

1 голос
/ 25 февраля 2020

Хотелось бы что-то вроде этой работы:

library(dplyr)
library(tidyr)
dt %>% 
  group_by(variant_id,transcript_id,is_NL) %>% 
  mutate(grp = case_when(counts == 0 ~ "0", counts > 0 ~ ">0")) %>% 
  count(grp) %>%
  ungroup() %>%
  mutate(
    is_NL = case_when(
      is_NL == 0 ~ "HH", # in the case when is_NL is 0 return HH etc.
      is_NL == 1 ~ "HN",
      is_NL == 2 ~ "NN",
    )
  ) %>% 
  # unite pastes the contents of the columns `is_NL` and `grp` together into the column `comb` separated by the value in `sep
  unite(comb, is_NL, grp, sep="") %>% 
  pivot_wider(names_from = comb, values_from = n)

Тильды - это просто особенность синтаксиса для case_when, который является удивительной функцией для расширенных ifelse-подобных случаев, когда вам нужно больше условий, чем просто логическое, стоит проверить документацию: https://dplyr.tidyverse.org/reference/case_when.html. Вы всегда можете проверить, что делает каждый шаг, просто закомментировав данный канал (%>%) и все после него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...