我有此数据:
[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;
}
您能建议我这样做吗?
答案 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))))))