簡體   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