【问题标题】:Double For Loop & If Else statement to calculate averages and store them in a matrixDouble For Loop 和 If Else 语句计算平均值并将它们存储在矩阵中
【发布时间】:2015-04-24 02:42:57
【问题描述】:

在这里,我提出了一个简单的问题,它需要一个 Double For 循环和一个 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

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

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

【问题讨论】:

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


    【解决方案1】:

    我想这就是你需要的:

    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
    

    【讨论】:

    • 这里的讽刺是我不能接受你的绿色检查答案,因为你回答的太快了,还有时间限制。 :)
    • 您似乎一直在一遍又一遍地问同一个问题,而您之前的问题已经提供了几乎相同的答案....
    • @DavidArenburg 对于涉及重叠主题的问题,我深表歉意。我只是对特定问题集的几种解决方案感兴趣。以后我会把它们浓缩成一篇文章!
    【解决方案2】:

    这是您第一个关于矩阵为什么不起作用的问题的答案

    以下代码行

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

    如果索引匹配,则检查值不匹配,您需要这样做

    if(i==j){
    

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多