Перекодировать категориальные переменные и изменить форму данных в R - PullRequest
1 голос
/ 30 января 2020

У меня есть датафрейм, содержащий данные по аллелям для многих людей. Существует несколько (> 20) уникальных аллелей для гена, перечисленных в 2 столбцах. Я хотел бы посчитать наличие 1 копии уникальных аллелей как 1, 2 копии как 2 и отсутствие как 0. Также каждый уникальный счетчик аллелей для каждого человека должен быть в отдельных столбцах.

Мой текущий df это

   ID   allele_1  allele_2 
   01   A01       A02
   02   A01       A07
   03   A08       A03
   04   A103      A01
   05   A09       A08
   06   A02       A02
   07   A08       A08 

Я хочу, чтобы мой df выглядел так:

   ID   A01  A02  A07  A08  A03 A103 A09  
   01   1    1    0    0    0   0    0 
   02   1    0    1    0    0   0    0
   03   0    0    0    1    1   0    0
   04   1    0    0    0    0   1    0
   05   0    0    0    1    0   0    1
   06   0    2    0    0    0   0    0
   07   0    0    0    2    0   0    0    

1 Ответ

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

Мы можем преобразовать в 'длинный' формат, получить 'count' и затем преобразовать в 'wide'

library(dplyr)
library(tidyr)
df1 %>%
     pivot_longer(cols = -ID) %>%
     count(ID, value) %>% 
     pivot_wider(names_from = value, values_from = n, values_fill = list(n = 0))
# A tibble: 7 x 8
#     ID   A01   A02   A07   A03   A08  A103   A09
#  <int> <int> <int> <int> <int> <int> <int> <int>
#1     1     1     1     0     0     0     0     0
#2     2     1     0     1     0     0     0     0
#3     3     0     0     0     1     1     0     0
#4     4     1     0     0     0     0     1     0
#5     5     0     0     0     0     1     0     1
#6     6     0     2     0     0     0     0     0
#7     7     0     0     0     0     2     0     0

или table из base R

table(rep(df1$ID, 2), unlist(df1[-1]))

Или с recast из reshape2

library(reshape2)
recast(df1, id.var = 'ID', ID ~ value, length)

data

df1 <- structure(list(ID = 1:7, allele_1 = c("A01", "A01", "A08", "A103", 
"A09", "A02", "A08"), allele_2 = c("A02", "A07", "A03", "A01", 
"A08", "A02", "A08")), class = "data.frame", row.names = c(NA, 
-7L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...