Double For Loop 并计算 R 中的平均值
Double For Loop and calculate averages in R
我有一个小问题,我不确定如何解决这个错误。
基本上,我有两列,我想使用 Double For 循环来计算两列中每个数字之间的平均值,从而得到一个平均值向量。澄清一下,apply 和 mean 函数不是最好的函数,因为我只需要所有可能组合的一半就可以获得平均值。例如:
Col1<-c(1,2,3,4,5)
Col2<-c(1,2,3,4,5)
Q1<-data.frame(cbind(Col1, Col2))
Q1$mean<-0
for (i in 1:length(Q1$Col1)) {
for (j in i+1:length(Q1$Col2)) {
Q1$mean[i]<-(Q1$Col1[i]+Q1$Col2[j])/2
}
}
基本上,对于 Q1$Col1 中的每个数字,我希望它与 Q1$Col2 进行平均。我之所以要使用双for循环是为了消除重复。这是提供可视化的矩阵版本:
1.0 1.5 2.0 2.5 3.0
1.5 2.0 2.5 3.0 3.5
2.0 2.5 3.0 3.5 4.0
2.5 3.0 3.5 4.0 4.5
3.0 3.5 4.0 4.5 5.0
此处,每一行代表 Q1$Col1 中的一个数字,每一列代表 Q1$Col2 中的一个数字。但是,请注意矩阵对角线的两边都有冗余。因此,使用 Double For 循环,我消除了冗余以获得唯一案例组合的平均值。使用上面的矩阵,它应该是这样的:
1.0 1.5 2.0 2.5 3.0
2.0 2.5 3.0 3.5
3.0 3.5 4.0
4.0 4.5
5.0
我认为您要问的是:给定两个数字向量,我如何找到每个向量中第一项的平均值,每个向量中第二项的平均值,等等。如果是这种情况,那么这里有一种方法可以做到这一点。
首先,您要使用 cbind()
而不是 rbind()
以获得列而不是行。
Col1<-c(1,2,3,4,5)
Col2<-c(2,3,4,5,6)
Q1<-cbind(Col1, Col2)
然后您可以使用函数 [rowMeans()][1]
计算(您猜对了)每一行的均值。 (另见 rowSums()
和 colMeans()
和 colSums()
。)
rowMeans(Q1)
#> [1] 1.5 2.5 3.5 4.5 5.5
更通用的方法是 apply()
函数,它可以让我们对每一列或每一行应用一个函数。这里我们使用参数 1
将其应用于行(因为第一行采用 Col1
和 Col2
等中的第一项)。
apply(Q1, 1, mean)
结果如下:
#> [1] 1.5 2.5 3.5 4.5 5.5
如果您真的希望它们出现在您现有的矩阵中,您可以这样做:
means <- rowMeans(Q1)
cbind(Q1, means)
您不需要循环来获取平均值,您可以使用矢量化操作:
Col1 <- c(1,2,3,4,5)
Col2 <- c(2,3,4,5,6)
Mean <- (Col1+Col2)/2
Q1 <- rbind(Col1, Col2, Mean)
但是 rbind 将向量视为行,您可以将 cbind 用于列。
您可以只使用 outer
函数先计算平均值,然后使用 lower.tri
用 NA
值填充矩阵对角线下方的区域。
matrix<-outer(Q1$Col1, Q1$Col2, "+")/2
matrix[lower.tri(matrix)] = NA
我有一个小问题,我不确定如何解决这个错误。
基本上,我有两列,我想使用 Double For 循环来计算两列中每个数字之间的平均值,从而得到一个平均值向量。澄清一下,apply 和 mean 函数不是最好的函数,因为我只需要所有可能组合的一半就可以获得平均值。例如:
Col1<-c(1,2,3,4,5)
Col2<-c(1,2,3,4,5)
Q1<-data.frame(cbind(Col1, Col2))
Q1$mean<-0
for (i in 1:length(Q1$Col1)) {
for (j in i+1:length(Q1$Col2)) {
Q1$mean[i]<-(Q1$Col1[i]+Q1$Col2[j])/2
}
}
基本上,对于 Q1$Col1 中的每个数字,我希望它与 Q1$Col2 进行平均。我之所以要使用双for循环是为了消除重复。这是提供可视化的矩阵版本:
1.0 1.5 2.0 2.5 3.0
1.5 2.0 2.5 3.0 3.5
2.0 2.5 3.0 3.5 4.0
2.5 3.0 3.5 4.0 4.5
3.0 3.5 4.0 4.5 5.0
此处,每一行代表 Q1$Col1 中的一个数字,每一列代表 Q1$Col2 中的一个数字。但是,请注意矩阵对角线的两边都有冗余。因此,使用 Double For 循环,我消除了冗余以获得唯一案例组合的平均值。使用上面的矩阵,它应该是这样的:
1.0 1.5 2.0 2.5 3.0
2.0 2.5 3.0 3.5
3.0 3.5 4.0
4.0 4.5
5.0
我认为您要问的是:给定两个数字向量,我如何找到每个向量中第一项的平均值,每个向量中第二项的平均值,等等。如果是这种情况,那么这里有一种方法可以做到这一点。
首先,您要使用 cbind()
而不是 rbind()
以获得列而不是行。
Col1<-c(1,2,3,4,5)
Col2<-c(2,3,4,5,6)
Q1<-cbind(Col1, Col2)
然后您可以使用函数 [rowMeans()][1]
计算(您猜对了)每一行的均值。 (另见 rowSums()
和 colMeans()
和 colSums()
。)
rowMeans(Q1)
#> [1] 1.5 2.5 3.5 4.5 5.5
更通用的方法是 apply()
函数,它可以让我们对每一列或每一行应用一个函数。这里我们使用参数 1
将其应用于行(因为第一行采用 Col1
和 Col2
等中的第一项)。
apply(Q1, 1, mean)
结果如下:
#> [1] 1.5 2.5 3.5 4.5 5.5
如果您真的希望它们出现在您现有的矩阵中,您可以这样做:
means <- rowMeans(Q1)
cbind(Q1, means)
您不需要循环来获取平均值,您可以使用矢量化操作:
Col1 <- c(1,2,3,4,5)
Col2 <- c(2,3,4,5,6)
Mean <- (Col1+Col2)/2
Q1 <- rbind(Col1, Col2, Mean)
但是 rbind 将向量视为行,您可以将 cbind 用于列。
您可以只使用 outer
函数先计算平均值,然后使用 lower.tri
用 NA
值填充矩阵对角线下方的区域。
matrix<-outer(Q1$Col1, Q1$Col2, "+")/2
matrix[lower.tri(matrix)] = NA