создание матрицы с нулем и единицей - PullRequest
1 голос
/ 12 ноября 2019

У меня есть эти данные:

A <- c("G", "C", "K")
B <- c("S", "B", "A")
C <- c("A", "M", "C")

И у меня есть эта матрица.

      [A]   [B]  [C]
[1,]    T    S    R
[2,]    Y    N    C
[3,]    G    U    N
[4,]    C    Z    Q
[5,]    S    D    K
[6,]    M    A    M
[7,]    S    B    F
[8,]    K    J    A

Моя идея состоит в том, чтобы создать новую тепловую карту 8 строк x 3 столбца, где в каждом столбце, еслиСтроки не содержат букв в переменных, я даю ноль. Наоборот, если буква, соответствующая которой содержится в переменных, означает 1. Я хотел бы получить что-то вроде этого:

       [A]   [B]  [C]
[1,]    0    1    0
[2,]    0    0    1
[3,]    1    0    0
[4,]    1    0    0
[5,]    0    0    0
[6,]    0    1    1
[7,]    0    1    0
[8,]    1    0    1

Не могли бы вы предложить мне способ сделать это?

Ответы [ 4 ]

4 голосов
/ 12 ноября 2019

Можно использовать mapply для одновременной итерации по столбцам матрицы и элементам list(A, B, C)

mapply(function(col, vec) +(col %in% vec), as.data.frame(mat), list(A, B, C))
#     A B C
#[1,] 0 1 0
#[2,] 0 0 1
#[3,] 1 0 0
#[4,] 1 0 0
#[5,] 0 0 0
#[6,] 0 1 1
#[7,] 0 1 0
#[8,] 1 0 1

Объяснение: col %in% vec проверяет соответствие записей из vec ввектор столбца матрицы. Унарный оператор + преобразует TRUE / FALSE в 1 / 0.


Или даже короче (спасибо @thelatemail)

+mapply(`%in%`, as.data.frame(mat), list(A, B, C))

Пример данных

A <- c("G", "C", "K")
B <- c("S", "B", "A")
C <- c("A", "M", "C")
mat <- matrix(c(
    "T", "Y", "G", "C", "S", "M", "S", "K",
    "S", "N", "U", "Z", "D", "A", "B", "J",
    "R", "C", "N", "Q", "K", "M", "F", "A"),
    ncol = 3)
colnames(mat) <- c("A", "B", "C")
2 голосов
/ 12 ноября 2019

Мы можем использовать map2 от purrr

library(purrr)
+(map2_dfr(asplit(mat, 2), list(A, B, C), `%in%`))
#   A B C
#1 0 1 0
#2 0 0 1
#3 1 0 0
#4 1 0 0
#5 0 0 0
#6 0 1 1
#7 0 1 0
#8 1 0 1
0 голосов
/ 12 ноября 2019

Для вашей матрицы M может помочь следующее:

sapply(colnames(M), function(x) as.numeric(!is.na(match(M[,x],eval(parse(text = x))))))
0 голосов
/ 12 ноября 2019

Я бы создал список с A, B, C и поверх соответствующих столбцов

mat <- structure(c("T", "Y", "G", "C", "S", "M", "S", "K", "S", "N", 
    "U", "Z", "D", "A", "B", "J", "R", "C", "N", "Q", "K", "M", "F", 
    "A"), .Dim = c(8L, 3L), .Dimnames = list(c("[1,]", "[2,]", "[3,]", 
    "[4,]", "[5,]", "[6,]", "[7,]", "[8,]"), c("A", "B", "C")))

    LIST = list(A=A,B=B,C=C)

    sapply(names(LIST),function(i)as.numeric(mat[,i] %in% LIST[[i]]))
         A B C
    [1,] 0 1 0
    [2,] 0 0 1
    [3,] 1 0 0
    [4,] 1 0 0
    [5,] 0 0 0
    [6,] 0 1 1
    [7,] 0 1 0
    [8,] 1 0 1
...