Создание двоичной матрицы в R с неравномерным фреймом данных - PullRequest
1 голос
/ 30 мая 2020

У меня есть набор данных с микроРНК в 8 разных группах. Мне нужно преобразовать этот фрейм данных в бинарную матрицу с помощью R. Количество микроРНК в группах разное, и я хотел бы создать группы в строке и разместить микроРНК в столбцах. Вот часть данных:

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

Но он дает мне много рядов. Кто-нибудь может мне с этим помочь?

Ответы [ 2 ]

2 голосов
/ 30 мая 2020

Вот один вариант с 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

data

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))
1 голос
/ 30 мая 2020

Предполагая, что пробелы в вашем фрейме данных - "":

df = structure(list(Group1 = c("miR-133a", "miR-777", "miR-878", "", 
""), Group2 = c("miR-133b", "miR138", "", "", ""), Group3 = c("miR-456", 
"miR-564", "miR-777", "miR-878", "miR-978"), Group4 = c("miR777", 
"miR-878", "miR978", "", "")), row.names = c(NA, -5L), class = "data.frame")

Затем создайте главный набор всех элементов:

alla = setdiff(sort(unique(unlist(df))),"")
res = t(sapply(colnames(df),function(i)as.numeric(alla %in% df[,i])))
colnames(res) = alla

       miR-133a miR-133b miR-456 miR-564 miR-777 miR-878 miR-978 miR138 miR777
Group1        1        0       0       0       1       1       0      0      0
Group2        0        1       0       0       0       0       0      1      0
Group3        0        0       1       1       1       1       1      0      0
Group4        0        0       0       0       0       1       0      0      1
       miR978
Group1      0
Group2      0
Group3      0
Group4      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...