[英]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.