创建一个零和一的矩阵

时间:2019-11-11 22:50:58

标签: r matrix zero

我有此数据:

      [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

我有这个矩阵。

       [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

我的想法是创建一个新的8行x 3列的热图,如果每行中的变量中都不包含字母,则每行给出0。相反,如果字母对应于变量中包含的字母,则为1。我会得到这样的东西:

private static int zad4() {
    char[] word = {'j', 'a', 'v', 'a'};
    char[] arr =  new char[100];

    // random characters from a to z
    for (int i = 0; i < arr.length; i++) {
        arr[i] = (char)('a' + Math.random() * ('z' - 'a' + 1));
    }

    int countWord = 0;
    for (int i = 0; i < arr.length; i++) {
        if(arr[i] == word[0]) {
            boolean matches = true;
            for(int j = 0; j < word.length; j ++) {
                matches = word[j] == arr[i + j];
                if(!matches)
                {
                    break;
                }
            }
            if(matches) {
                countWord ++;
                i += word.length - 1;
            }
        }
    }

    return countWord;
}

您能建议我这样做吗?

5 个答案:

答案 0 :(得分:4)

一种选择是使用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")

答案 1 :(得分:2)

我们可以使用flip()中的map2

purrr

答案 2 :(得分:0)

我将创建一个具有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

答案 3 :(得分:0)

我敢打赌,有一个更简单的解决方案,但是以下方法可以解决问题。

mat1是字母矩阵。

mat2是二进制(1,0)矩阵。

函数contains(x,y)接受x(要测试的字符向量)和y(将列名作为字符串),然后检查该列。

A <- c("G", "C", "K")
B <- c("S", "B", "A")
C <- c("A", "M", "C")
mat1 <- matrix(c("T","S", "R", "Y", "N", "C", "G", "U", "N", "C", "Z", "Q", "S", "D", "K", "M", "A", "M", "S", "B", "F", "K", "J", "A"), nrow = 8, ncol = 3, dimnames = list(c(1:8), c("A", "B", "C")), byrow=TRUE)
mat2 <- matrix(0L, nrow = 8, ncol = 3, dimnames = list(c(1:8), c("A", "B", "C")))

row_count <- 1
contains <- function(x, y){
  for (i in mat1[,y]){
    if (i %in% x){
      mat2[row_count,y] <<- 1
    }
    row_count <<- row_count +1
  }
}


contains(A, "A")
contains(B, "B")
contains(C, "C")

希望有帮助, 干杯!

答案 4 :(得分:0)

对于您的矩阵M,以下内容可能会对您有所帮助:

sapply(colnames(M), function(x) as.numeric(!is.na(match(M[,x],eval(parse(text = x))))))