r - 在 R 中创建具有不均匀数据帧的二进制矩阵
问题描述
我有一个包含 8 个不同组的 microRNA 的数据集。我需要使用 R 将此数据框转换为二进制矩阵。组中 microRNA 的数量不同,我想在行中创建组,并在列上放置 microRNA。以下是部分数据:
Group1 Group2 Group3 Group4
miR-133a miR-133b miR-456 miR777
miR-777 miR138 miR-564 miR-878
miR-878 miR-777 miR978
miR-878
miR-978
预期输出:
Groups miR-133a miR-133b miR-456 miR-777.....
Group1 1 0 0 1
Group2 0 1 0 0
.
.
.
我尝试使用此代码:
im <- which(arr.ind=T,Dat!='');
u <- unique(Dat[im[order(im[,'row'],im[,'col']),]]);
res <- matrix(0L,nrow(Dat),length(u),dimnames=list(NULL,u));
res[cbind(im[,'row'],match(Dat[im],u))] <- 1L;
res
但它给了我很多行。任何人都可以帮助我吗?
解决方案
这是一个选项tidyverse
。重塑为“长”格式,然后将其转换回“宽”格式pivot_wider
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = everything(), names_to = 'Groups',
values_drop_na = TRUE) %>%
distinct %>%
mutate(new =1) %>%
pivot_wider(names_from =value, values_from = new,
values_fill = list(new = 0))
#Groups `miR-133a` `miR-133b` `miR-456` miR777 `miR-777` miR138 `miR-564` `miR-878` miR978 `miR-978`
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Group1 1 0 0 0 1 0 0 1 0 0
#2 Group2 0 1 0 0 0 1 0 0 0 0
#3 Group3 0 0 1 0 1 0 1 1 0 1
#4 Group4 0 0 0 1 0 0 0 1 1 0
或base R
与table
table(names(df1)[col(df1)], unlist(df1))
# miR-133a miR-133b miR-456 miR-564 miR-777 miR-878 miR-978 miR138 miR777 miR978
# Group1 1 0 0 0 1 1 0 0 0 0
# Group2 0 1 0 0 0 0 0 1 0 0
# Group3 0 0 1 1 1 1 1 0 0 0
# Group4 0 0 0 0 0 1 0 0 1 1
注意:在这里,我们假设空白为NA
. 如果是""
,请先将其更改为NA
,然后使用相同的代码
df1[df1 == ""] <- NA
数据
df1 <- structure(list(Group1 = c("miR-133a", "miR-777", "miR-878", NA,
NA), Group2 = c("miR-133b", "miR138", NA, NA, NA), Group3 = c("miR-456",
"miR-564", "miR-777", "miR-878", "miR-978"), Group4 = c("miR777",
"miR-878", "miR978", NA, NA)), class = "data.frame", row.names = c(NA,
-5L))
推荐阅读
- python - 如何在 matplotlib 文本中结合颜色和数字打印格式?
- azure-devops - 作为 Azure DevOps 管道的一部分,如何将 XSD 上传到 Azure 集成帐户?
- python - 从图表中抓取数据
- css - 将资产图像路径作为动态内联样式背景图像 url (Nuxt.js)
- mongodb - 该字段必须是一个累加器对象
- c# - 正则表达式并排匹配 2 个数字或字符
- php - Laravel:无法使用 Postman 表单数据获取帖子数据
- carrierwave - Rails 6 Rspec 在 Carrierwave 上传器上抛出“ActiveModel::MissingAttributeError”
- asp.net - 'http://***.168.**.8:***/UploadedFiles/CustomerKYC/Photo/134_26581.jpg' 不是有效的虚拟路径
- python - Pandas - 用新值覆盖单列,保留其他列;覆盖原始文件