Double For Loop & If Else 语句计算平均值并将它们存储在矩阵中
Double For Loop & If Else statement to calculate averages and store them in a matrix
在这里,我提出了一个简单的问题,它需要一个 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]<-NA
进行轻微调整,或者如果 match(Q1$A[i],Q1$B[j])
就足够的话,可以跳到下一个循环。
关于我的第二个问题,我很好奇是否有涉及 apply()、dplyr() 或任何其他包或基本 R 函数的更简单的解决方案。
我想这就是你需要的:
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
这是对您关于矩阵为何不起作用的第一个问题的回答
下面一行代码
if(Q1$A[i]==Q1$B[j]){
如果索引匹配,则检查值是否匹配,你需要做
if(i==j){
在这里,我提出了一个简单的问题,它需要一个 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]<-NA
进行轻微调整,或者如果 match(Q1$A[i],Q1$B[j])
就足够的话,可以跳到下一个循环。
关于我的第二个问题,我很好奇是否有涉及 apply()、dplyr() 或任何其他包或基本 R 函数的更简单的解决方案。
我想这就是你需要的:
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
这是对您关于矩阵为何不起作用的第一个问题的回答
下面一行代码
if(Q1$A[i]==Q1$B[j]){
如果索引匹配,则检查值是否匹配,你需要做
if(i==j){