【问题标题】:Reduce columns of a matrix by a function in R通过 R 中的函数减少矩阵的列
【发布时间】:2016-03-10 19:30:03
【问题描述】:

我有一个类似的矩阵:

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

有些列名是相同的。我想通过在列具有相同名称的同一行中取所有值的最小值来从本质上减少该矩阵中的列。对于这个特定的矩阵,结果如下所示:

#   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 列。我试图解决这个问题的方法是melting 数据,然后使用 dplyr 中的group_by,然后再整形回矩阵。问题是从熔体生成数据帧需要很长时间,我希望能够更快地迭代。

【问题讨论】:

    标签: r performance matrix


    【解决方案1】:

    我们可以从library(matrixStats)使用rowMins

    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)
    

    【讨论】:

    • 你能更新它以保持行和列名吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多