繁体   English   中英

在 R 中重新编码分类变量并重塑数据框

[英]Recode categorical variables and reshape dataframe in R

我有一个包含许多人的等位基因数据的数据框。 2 列中列出的基因有多个 (>20) 个独特的等位基因。 我想将存在 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    

我们可以转换为“长”格式,获取“计数”,然后重新整形为“宽”

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

或从base R table

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

或者从reshape2 recast

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

数据

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM