通过R中的函数减少矩阵的列

时间:2016-03-10 19:30:03

标签: r performance matrix

我有一个类似的矩阵:

data <- round(runif(30)*10)
dimnames <- list(c("1","2","3","4","5"),c("1","2","3","2","3","2"))
values <- matrix(data, ncol=6, dimnames=dimnames)
#   1 2 3 2  3 2
# 1 5 4 9 6  7 8
# 2 6 9 9 1  2 5
# 3 1 2 5 3 10 1
# 4 6 5 1 8  6 4
# 5 6 4 5 9  4 4

某些列名称相同。我想通过获取列具有相同名称的同一行中的所有值的min来基本上减少此矩阵中的列。对于这个特定的矩阵,结果如下:

#   1 2 3
# 1 5 4 7
# 2 6 1 2
# 3 1 1 5
# 4 6 4 1
# 5 6 4 4

我在这里使用的实际数据集大约有50,000列和4,500行。没有任何值丢失,结果将有大约40,000列。我尝试解决这个问题的方法是melt数据然后使用来自dplyr的group_by重新编码回矩阵。问题是从融化生成数据框需要花费很长时间,我希望能够更快地迭代。

1 个答案:

答案 0 :(得分:4)

我们可以使用rowMins

中的library(matrixStats)
library(matrixStats)
res <- vapply(split(1:ncol(values), colnames(values)),
    function(i) rowMins(values[,i,drop=FALSE]), rep(0, nrow(values)))
res
#     1 2 3
#[1,] 5 4 7
#[2,] 6 1 2
#[3,] 1 1 5
#[4,] 6 4 1
#[5,] 6 4 4

row.names(res) <- row.names(values)