Подсчет количества экземпляров вариантов по нескольким вариантам в когорте контроля случаев с использованием R - PullRequest
1 голос
/ 21 января 2020

У меня есть таблица с описанием вариантов c, где каждая строка представляет пациента, у которого виден вариант, и виден ли этот вариант в случае или в контроле. Я хотел бы вывести отдельную матрицу с тремя столбцами - вариант, число в случаях и число в элементах управления, чтобы выполнить тест Фишера.

Я использую R, и таблица выглядит следующим образом (PID - идентификатор пациента)

Variant ID      PID     Disease
2:4324:2343     FF354   Yes
2:4324:2343     FF355   Control
2:4324:2343     FF356   Control
2:4324:2343     FF357   Yes
2:4324:2343     FF358   Yes
3:346543:345    FF354   Yes
3:346543:345    FF358   Control
3:346543:345    FF390   Control
3:346543:345    FF391   Yes
6:234:34234     FF358   Yes
6:234:34234     FF390   Control
6:234:34234     FF358   Control
6:234:34234     FF213   Yes 

Желаемый результат будет:

Variant ID  Disease Control
2:4324:2343     3   2
3:346543:345    2   2
6:234:34234     2   2

Я думаю, я бы Я должен использовать al oop в R, но я должен признать, что в настоящее время это не для меня, пока я справляюсь с R. Любая помощь будет принята с благодарностью!

Большое спасибо

Ответы [ 3 ]

1 голос
/ 21 января 2020

Использование dcast из data.table:

library(data.table)
setDT(df); dcast(df, VariantID ~ Disease)

#     VariantID  Control  Yes
#1  2:4324:2343       2   3
#2  3:346543:345      2   2
#3  6:234:34234       2   2

data

df <- structure(list(VariantID = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("2:4324:2343", "3:346543:345", "6:234:34234"), class = "factor"), PID = structure(c(2L, 3L,4L, 5L, 6L, 2L, 6L, 7L, 8L, 6L, 7L, 6L, 1L), .Label = c("FF213","FF354", "FF355", "FF356", "FF357", "FF358", "FF390", "FF391"), class = "factor"), Disease = structure(c(2L, 1L, 1L, 2L, 2L,2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L), .Label = c("Control", "Yes"), class = "factor")), class = "data.frame", row.names = c(NA, -13L))
1 голос
/ 21 января 2020

Вы можете использовать tapply, что дает вам хорошую матрицу.

with(dat, tapply(Disease, list(Variant_ID, Disease), length))
#              Control Yes
# 2:4324:2343        2   3
# 3:346543:345       2   2
# 6:234:34234        2   2

Данные:

dat <- structure(list(Variant_ID = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("2:4324:2343", "3:346543:345", 
"6:234:34234"), class = "factor"), PID = structure(c(2L, 3L, 
4L, 5L, 6L, 2L, 6L, 7L, 8L, 6L, 7L, 6L, 1L), .Label = c("FF213", 
"FF354", "FF355", "FF356", "FF357", "FF358", "FF390", "FF391"
), class = "factor"), Disease = structure(c(2L, 1L, 1L, 2L, 2L, 
2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L), .Label = c("Control", "Yes"), class = "factor")), class = "data.frame", row.names = c(NA, 
-13L))
1 голос
/ 21 января 2020

Мы можем получить частоту count и затем изменить ее на «широкий»

library(dplyr)
library(tidyr)
df1 %>% 
    count(VariantID, Disease) %>%
    pivot_wider(names_from = Disease, values_from = n)
# A tibble: 3 x 3
#  VariantID    Control   Yes
#  <chr>          <int> <int>
#1 2:4324:2343        2     3
#2 3:346543:345       2     2
#3 6:234:34234        2     2

Или с table из base R

table(df1[c('VariantID', 'Disease')])
#            Disease
#VariantID      Control Yes
# 2:4324:2343        2   3
# 3:346543:345       2   2
# 6:234:34234        2   2

данных

df1 <- structure(list(VariantID = c("2:4324:2343", "2:4324:2343", "2:4324:2343", 
"2:4324:2343", "2:4324:2343", "3:346543:345", "3:346543:345", 
"3:346543:345", "3:346543:345", "6:234:34234", "6:234:34234", 
"6:234:34234", "6:234:34234"), PID = c("FF354", "FF355", "FF356", 
"FF357", "FF358", "FF354", "FF358", "FF390", "FF391", "FF358", 
"FF390", "FF358", "FF213"), Disease = c("Yes", "Control", "Control", 
"Yes", "Yes", "Yes", "Control", "Control", "Yes", "Yes", "Control", 
"Control", "Yes")), class = "data.frame", row.names = c(NA, -13L
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...