2017-05-05 34 views
0

我想根据另一个矩阵中的条件得到一个新的矩阵。原来的矩阵(矩阵1)看起来是这样的:如何根据另一个矩阵的条件为矩阵写一个for循环?

[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行中,应将第4列和第5列替换为“NA”,而在第3行中,第4列应保持“10”,并将第5列替换为“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行和包含“NA” 18列的矩阵。我几乎可以肯定,我的代码不止有一个问题。另外,事实上,这个条件只适用于matrix1 [2:16,3:17],但我不知道如何写这个。非常感谢您的帮助!

回答

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 

与以前一样,您可以使用通常的子集排除第一列或最后一列。

+0

非常感谢您的帮助!我为这个令人困惑的描述感到抱歉 - 现在想做得更好。您的代码将生成一个矩阵,其中只包含最后一列(和NA值)中的名称(name1,name2等)。但是,我需要的是最后一列和实际数据(请参阅我的问题,使用的示例为10和20)中的名称的矩阵 - 但仅限于那些名称在末尾的单元格行与单元格正上方第一行中的名称相同。第三行应该导致NA,NA,NA,10,NA,...,name2。我希望现在更清楚。 – airad

相关问题