Double For Loop&如果Else语句计算平均值并将它们存储在矩阵中

时间:2015-02-22 19:57:56

标签: r if-statement for-loop matrix mean

在这里,我提出了一个简单的问题,需要Double For Loop和If Else语句。我的第一个问题是辅助小故障排除,我的第二个问题是更好奇的驱动因为我对更短,更优雅的解决方案感兴趣。在第一个问题的情况下,这是一个例子:

A<-c(1,2,3,4,5)
B<-c(2,3,4,5,6)
Q1<-data.frame(cbind(A,B))
mean<-matrix(nrow=5, ncol = 5)
for(i in 1: length(Q1$A)){
  for(j in 1: length(Q1$B)){
    if(Q1$A[i]==Q1$B[j]){
      mean[i,j]<-NA
    }else{
      mean[i,j]<-sum(Q1$A[i]+Q1$B[j])/2
    }
  }
}

基本上,我有两个向量,我希望计算Q1 $ A中每个值的平均值,Q1 $ B中的每个值除外,当Q1 $ A的指数与Q1 $ B的指数匹配时(例如Q1) $ A [1] == Q1 $ B [1])然后将它们存储在矩阵中。

这是我希望获得的:

     [,1] [,2] [,3] [,4] [,5]
[1,]   NA  2.0  2.5  3.0  3.5
[2,]  2.0   NA  3.0  3.5  4.0
[3,]  2.5  3.0   NA  4.0  4.5
[4,]  3.0  3.5  4.0   NA  5.0
[5,]  3.5  4.0  4.5  5.0   NA

但是,以下是我的结果:

     [,1] [,2] [,3] [,4] [,5]
[1,]  1.5  2.0  2.5  3.0  3.5
[2,]   NA  2.5  3.0  3.5  4.0
[3,]  2.5   NA  3.5  4.0  4.5
[4,]  3.0  3.5   NA  4.5  5.0
[5,]  3.5  4.0  4.5   NA  5.5

非常感谢任何简单的解决方案。如果mean[i,j]<-NA就足够了,我会想象在我的ifelse语句中使用match(Q1$A[i],Q1$B[j])进行轻微调整,或者跳转到下一个循环的函数。

关于我的第二个问题,我很好奇是否有一个更简单的解决方案涉及apply(),dplyr()或任何其他包或基本R函数。

2 个答案:

答案 0 :(得分:4)

我认为这就是你所需要的:

A<-c(1,2,3,4,5)
B<-c(2,3,4,5,6)
Q1<-data.frame(cbind(A,B))

res <- outer(A, B, "+")/2
diag(res) <- NA
res

outer()函数完成所有魔法。结果:

     [,1] [,2] [,3] [,4] [,5]
[1,]   NA  2.0  2.5  3.0  3.5
[2,]  2.0   NA  3.0  3.5  4.0
[3,]  2.5  3.0   NA  4.0  4.5
[4,]  3.0  3.5  4.0   NA  5.0
[5,]  3.5  4.0  4.5  5.0   NA

答案 1 :(得分:4)

这是关于矩阵无效的第一个问题的答案

以下代码行

if(Q1$A[i]==Q1$B[j]){

如果索引匹配,则检查值是否匹配,您需要执行

if(i==j){