Как заполнить матрицу исходя из двух условий? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть два кадра данных, df_1:

  symbol Sample_name                        
 1 MTPAP       sample_1
 2 MTPAP       sample_1
 3 MTPAP          sample_1
 4 TENT2      sample_1
 5 KIDINS220   sample_2
 6 POLR1A        sample_3
 7 CCDC138     sample_4
 8 CCDC74A     sample_5
 9 ATF2        sample_6
10 TLR9        sample_7

и df_2:

      HGNC.ID         symbol
1  HGNC:25532           MTPAP
2  HGNC:26776           TENT2
3  HGNC:16705          TENT4A
4  HGNC:30758          TENT4B
5  HGNC:26184            TUT1
6  HGNC:28981            TUT4
7  HGNC:25817            TUT7
8  HGNC:17264          POLR1A
9  HGNC:20454          POLR1B
10 HGNC:20194          POLR1C

Я хотел бы создать матрицу с именами столбцов, соответствующими значениям, присутствующим в«Sample_name» из df_1 и имена строк, соответствующие «символу» из df_2. Значения для каждой пары «symbol» / «sample_name» должны быть «1», если значение «symbol» из df_2 присутствует как «symbol» в df_1 симя сэмпла в df_1 и «0», если в «df_1» не существует заданного «символа» / «имени-образца»:

        Sample_1 Sample_2 Sampl_3 
MTPAP      1       0        0
TENT2      1       0        0
TENT4A     0       0        0
TENT4B     0       0        0
TUT1       0       0        0
TUT4       0       0        0
TUT7       0       0        0
POLR1A     0       0        1
POLR1B     0       0        0
POLR1C     0       0        0

Я создал пустую матрицу с:

c <- matrix(data = NA, nrow = length(unique(df_2$symbol)), ncol = length(unique(df_1$Sample_name)))
  colnames(c) <- unique(df_1$Sample_name)
  rownames(c) <- unique(df_2$symbol)

и у меня было несколько попыток заполнить его данными из df_1 и df_2, но до сих пор я с треском провалился ...

Может ли кто-нибудь помочь мне, пожалуйста?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Используйте merge, а затем dcast из пакета reshape2.

res <- merge(df_2[2], df_1, all.x = TRUE)
res$Sample_name <- as.character(res$Sample_name)
res$Sample_name[is.na(res$Sample_name)] <- ""

reshape2::dcast(res, symbol ~ Sample_name, value.var = "Sample_name")
#   symbol Var.2 sample_1 sample_3
#1   MTPAP     0        3        0
#2  POLR1A     0        0        1
#3  POLR1B     1        0        0
#4  POLR1C     1        0        0
#5   TENT2     0        1        0
#6  TENT4A     1        0        0
#7  TENT4B     1        0        0
#8    TUT1     1        0        0
#9    TUT4     1        0        0
#10   TUT7     1        0        0

Данные в формате dput.

df_1 <-
structure(list(symbol = structure(c(5L, 5L, 5L, 
7L, 4L, 6L, 2L, 3L, 1L, 8L), .Label = c("ATF2", 
"CCDC138", "CCDC74A", "KIDINS220", "MTPAP", 
"POLR1A", "TENT2", "TLR9"), class = "factor"), 
Sample_name = structure(c(1L, 1L, 1L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L), .Label = c("sample_1", "sample_2", 
"sample_3", "sample_4", "sample_5", "sample_6", 
"sample_7"), class = "factor")), 
class = "data.frame", row.names = c("1", "2", 
"3", "4", "5", "6", "7", "8", "9", "10"))

df_2 <-
structure(list(HGNC.ID = structure(c(5L, 
8L, 1L, 10L, 7L, 9L, 6L, 2L, 4L, 3L), 
.Label = c("HGNC:16705", "HGNC:17264", "HGNC:20194", 
"HGNC:20454", "HGNC:25532", "HGNC:25817", 
"HGNC:26184", "HGNC:26776", "HGNC:28981", 
"HGNC:30758"), class = "factor"), 
symbol = structure(c(1L, 5L, 6L, 7L, 8L, 
9L, 10L, 2L, 3L, 4L), .Label = c("MTPAP", "POLR1A", 
"POLR1B", "POLR1C", "TENT2", "TENT4A", "TENT4B", 
"TUT1", "TUT4", "TUT7"), class = "factor")), 
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))
0 голосов
/ 06 февраля 2019

Я знаю, что у вас уже есть два ответа, но вот как я бы это сделал:)

Данные:

df_1 <- read.table(text = "symbol Sample_name                        
                   1 MTPAP       sample_1
                   2 MTPAP       sample_1
                   3 MTPAP          sample_1
                   4 TENT2      sample_1
                   5 KIDINS220   sample_2
                   6 POLR1A        sample_3
                   7 CCDC138     sample_4
                   8 CCDC74A     sample_5
                   9 ATF2        sample_6
                   10 TLR9        sample_7", header = TRUE, 
                   stringsAsFactors =T)
df_2 <- read.table(text = "      HGNC.ID         symbol
                   1  HGNC:25532           MTPAP
                   2  HGNC:26776           TENT2
                   3  HGNC:16705          TENT4A
                   4  HGNC:30758          TENT4B
                   5  HGNC:26184            TUT1
                   6  HGNC:28981            TUT4
                   7  HGNC:25817            TUT7
                   8  HGNC:17264          POLR1A
                   9  HGNC:20454          POLR1B
                   10 HGNC:20194          POLR1C", header= TRUE, 
                   stringsAsFactors =TRUE)

Сначала пустая матрица (не совсем пустая, но заполненнаязначение по умолчанию ... 0):

mat <- matrix(0, 
              ncol = length(unique(df_1$Sample_name)), 
              nrow = length(unique(df_2$symbol)),
              dimnames = list(unique(df_2$symbol), 
                              unique(df_1$Sample_name)))

Создайте таблицу из символов и образцов в df_1:

library(dplyr)
mat_2 <- df_1  %>% 
  unique %>% table

, теперь мы получаем нужные нам строки из mat_2, используяимена строк

wanted_rows <- rownames(mat_2)[rownames(mat_2) %in% df_2$symbol]
mat[wanted_rows,] <- mat_2[wanted_rows,] 
0 голосов
/ 06 февраля 2019

Один из вариантов - объединить два набора данных on в столбец «символ», а затем dcast от «длинный» до «широкий», указав fun.aggregate как length

library(data.table)
setDT(df_2)[df_1, Sample_name := Sample_name, on = .(symbol)]
df_2[, symbol := factor(symbol, levels = unique(symbol))]
dcast(df_2, symbol ~ factor(Sample_name, levels = paste0("sample_", 
          1:3)), length, drop = FALSE)
#     symbol sample_1 sample_2 sample_3
# 1:  MTPAP        1        0        0
# 2:  TENT2        1        0        0
# 3: TENT4A        0        0        0
# 4: TENT4B        0        0        0
# 5:   TUT1        0        0        0
# 6:   TUT4        0        0        0
# 7:   TUT7        0        0        0
# 8: POLR1A        0        0        1
# 9: POLR1B        0        0        0
#10: POLR1C        0        0        0

данные

df_1 <- structure(list(symbol = c("MTPAP", "MTPAP", "MTPAP", "TENT2", 
 "KIDINS220", "POLR1A", "CCDC138", "CCDC74A", "ATF2", "TLR9"), 
Sample_name = c("sample_1", "sample_1", "sample_1", "sample_1", 
"sample_2", "sample_3", "sample_4", "sample_5", "sample_6", 
"sample_7")), class = "data.frame", row.names = c("1", "2", 
 "3", "4", "5", "6", "7", "8", "9", "10"))

df_2 <- structure(list(HGNC.ID = c("HGNC:25532", "HGNC:26776", "HGNC:16705", 
"HGNC:30758", "HGNC:26184", "HGNC:28981", "HGNC:25817", "HGNC:17264", 
 "HGNC:20454", "HGNC:20194"), symbol = c("MTPAP", "TENT2", "TENT4A", 
 "TENT4B", "TUT1", "TUT4", "TUT7", "POLR1A", "POLR1B", "POLR1C"
  )), class = "data.frame", row.names = c("1", "2", "3", "4", "5", 
 "6", "7", "8", "9", "10"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...