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))))))