我正在尝试根据另一个矩阵中的条件获得一个新矩阵。原始矩阵(矩阵1)如下所示:
[empty] |V1 |V2 |V3 |V4 |V5 |.... |V17 | V18
1 |NA |NA |name1 |name2 |name3 |.... |name15|NA
2 |abc |2016 |NA |10 |20 |.... |NA |name1
3 |abc |2016 |NA |10 |20 |.... |NA |name2
4 |abc |2016 |NA |10 |20 |.... |NA |name3
... |abc |2016 |NA |10 |20 |.... |NA |....
16 |abc |2016 |NA |10 |20 |.... |NA |name15
我正在尝试编码的是具有以下条件的新矩阵(矩阵2):如果关注列中矩阵1的第一行的值等于关联中矩阵1的最后一列的值行,矩阵2应记下相关单元格中最初在矩阵1中的值;如果条件不正确,则应写入“NA”。例如,在第2行中,第四列和第五列应替换为“NA”,而在第3行中,第四列应保持“10”,第五列应替换为“NA”。 这是我到目前为止编码的内容:
a<-seq(1:16)
b<-seq(1:18)
matrix2<- matrix(nrow=16, ncol=18)
for(i in 1:dim(matrix2)[1]) {
for(j in 1:dim(matrix2)[2]) {
matrix2[i,j] = if("matrix1[a,b]"=="matrix1[a,18]") {"matrix1[a,b]"} else {"NA"}
}
}
print(matrix2)
返回的是一个包含16行和18列的矩阵,其中包含“NA”。我几乎可以肯定,我的代码不仅仅是一个问题。另外,事实上,条件只适用于matrix1 [2:16,3:17],但我不知道怎么写这个。非常感谢你的帮助!
答案 0 :(得分:0)
你的描述有点令人困惑,但我在伪数学中读到了你的帖子:
x_new[i,j]= x[i,j] if x[i,j]=x[i,J] and else NA, for all i,j
其中J
是矩阵中的列数。
这可以通过简单的ifelse
语句来实现。考虑:
set.seed(42)
mat <- matrix(sample(1:3, 9, T), ncol=3)
mat
[,1] [,2] [,3]
[1,] 3 3 3
[2,] 3 2 1
[3,] 1 2 2
mat2 <- ifelse(mat==mat[,ncol(mat)], mat, NA)
mat2
[,1] [,2] [,3]
[1,] 3 3 3
[2,] NA NA 1
[3,] NA 2 2
此处,ncol(mat)
表示矩阵的最后一列。您可以根据需要轻松调整这些。如果要排除第一列,请改用mat[,-1]
,如
mat2 <- ifelse(mat[,-1]==mat[,ncol(mat)], mat[,-1], NA)
编辑:您明确表示您希望仅针对第一行检查相等性。这可以通过以下方式实现。首先,让我们创建一个具有不同行数和列数的矩阵,如示例所示:
set.seed(42)
mat <- matrix(sample(1:3, 12, T), ncol=4)
mat
[,1] [,2] [,3] [,4]
[1,] 3 3 3 3
[2,] 3 2 1 2
[3,] 1 2 2 3
现在,我们需要知道第一行和最后一列的每个条目组合是否相等。 outer
可以做到这一点:
ind <- t(outer(mat[1,], mat[,ncol(mat)], FUN = `==`))
ind
[,1] [,2] [,3] [,4]
[1,] TRUE TRUE TRUE TRUE
[2,] FALSE FALSE FALSE FALSE
[3,] TRUE TRUE TRUE TRUE
这可以与简单的ifelse
语句一起使用。
mat2 <- ifelse(ind, mat, NA)
mat2
[,1] [,2] [,3] [,4]
[1,] 3 3 3 3
[2,] NA NA NA NA
[3,] 1 2 2 3
和以前一样,您可以使用通常的子集排除第一列或最后一列。