Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 创建具有0和1的矩阵_R_Matrix_Zero - Fatal编程技术网

R 创建具有0和1的矩阵

R 创建具有0和1的矩阵,r,matrix,zero,R,Matrix,Zero,我有以下数据: A <- c("G", "C", "K") B <- c("S", "B", "A") C <- c("A", "M", "C") 我的想法是创建一个新的热图,8行x 3列,如果每列中的行不包含变量中的字母,我给零。相反,如果字母对应变量中包含的字母,则出现1。我想得到这样的东西: [A] [B] [C] [1,] 0 1 0 [2,] 0 0 1 [3,] 1 0 0 [4,]

我有以下数据:

A <- c("G", "C", "K")
B <- c("S", "B", "A")
C <- c("A", "M", "C")
我的想法是创建一个新的热图,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

你能给我一个建议吗?

一个选项是使用
mappy
同时迭代矩阵的列和
列表(a,B,C)的元素。

说明:%vec中的
col%检查矩阵列向量中
vec
中的匹配项。一元运算符
+
TRUE
/
FALSE
转换为
1
/
0


甚至更短(谢谢@thelatemail)


样本数据
A一个选项是使用
mapply
同时迭代矩阵的列和
列表(A,B,C)的元素

说明:%vec
中的
col%检查矩阵列向量中
vec
中的匹配项。一元运算符
+
TRUE
/
FALSE
转换为
1
/
0


甚至更短(谢谢@thelatemail)


样本数据
A我敢打赌有一个更简单的解决方案,但是下面的方法很有效

mat1是字母矩阵

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

函数包含(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")

A我敢打赌有一个更简单的解决方案,但是下面的方法很有效

mat1是字母矩阵

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

函数包含(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")

A我们可以从
purr

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

我们可以从
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

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

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

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

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

如果你想避免%
@邮件中
%的反勾号,你可以折叠成
mappy(`in%`,as.data.frame(mat),list(A,B,C))+0
,甚至
mappy(is.element,as.data.frame(mat),list(A,B,C))+0
;一元
+
在这里也起作用:
+mappy(`in%`,as.data.frame(mat),list(A,B,C))
您可以折叠到
mappy(`in%`,as.data.frame(mat),list(A,B,C))+0
甚至
mappy(is.element,as.data.frame(mat),list(A,B,C))+0
如果您想避免%
@中
%的反勾号,最近的邮件非常整洁;一元
+
在这里也起作用:
+mapply(`in%`,as.data.frame(mat),list(A,B,C))
sapply(colnames(M), function(x) as.numeric(!is.na(match(M[,x],eval(parse(text = x))))))