我有一个类似的矩阵:
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
重新编码回矩阵。问题是从融化生成数据框需要花费很长时间,我希望能够更快地迭代。
答案 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)