【问题标题】:Quickest way to do an operation on every two (different) columns of a matrix in R?对R中矩阵的每两(不同)列进行操作的最快方法?
【发布时间】:2022-01-19 20:07:24
【问题描述】:

假设我们有一个 n×4 矩阵,我们希望找到该矩阵每 2 个不同列的平均值。在组合语言中,我们本质上想要找到所有不同的方法,我们可以从 4 列中选择 2 列并找到它们的平均值(或任何其他操作)。我们知道这暗示了 6 种不同的组合:(1,2), (1,3), (1,4), (2,3), (2,4), (3,4),
然后我们将继续对 6 对中的每一对进行感兴趣的操作。如何将此练习扩展到 R 中的一般 n×m 矩阵?

谢谢。

【问题讨论】:

标签: r combinatorics


【解决方案1】:

这可能不是最快的方法(如标题中要求的那样),但这种方法清晰而灵活。

这里我假设m=4 并且感兴趣的计算是两列的平均值之和:

# create example data (n-by-m matrix of values)
n <- 200
m <- 4
mat <- matrix(runif(n*m), nrow=n, ncol=m)

# get all column pairs
pairs <- t(combn(m, 2))
P <- nrow(pairs)

# allocate an "empty" vector to hold the results
result <- vector(length=P)

# loop over column pairs
for(p in 1:P) {
    i <- pairs[p,1]
    j <- pairs[p,2]
    result[p] <- mean(mat[,i]) + mean(mat[,j])
}

# view result
cbind(pairs, result)

【讨论】:

    【解决方案2】:

    DanY 解决方案恰到好处。我建议对于一个非常大的数据集,应用函数可能会更快。 DanY 解决方案,但带有 apply() 函数:

    # create example data (n-by-m matrix of values)
    n <- 200
    m <- 4
    mat <- matrix(runif(n*m), nrow=n, ncol=m)
    
    # get all column pairs
    pairs <- t(combn(m, 2))
    P <- nrow(pairs)
    
    # allocate an "empty" vector to hold the results
    result <- vector(length=P)
    
    #apply instead
    result <- apply(pairs, 1, function(x) {
      mean(mat[, x[1]]) + mean(mat[, x[2]])
    })
    
    # view result
    cbind(pairs, result)
    

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 2015-04-13
      相关资源
      最近更新 更多