【问题标题】:Efficient way compare data in matrix比较矩阵中数据的有效方法
【发布时间】:2020-12-30 14:17:42
【问题描述】:

我有以下问题。我必须使用以下函数比较矩阵(数据表或数据框)中的数据:

Q <- function(j){
        
        # j = (1:dim(x)[1])[1]
        Q1 <- c()
        for(i in 2:ncol(x)){
        # i = 2
        item <- x[j,1]
        indices <- which(x[,i] == item)
     
        items <- x[1:indices, i]
        Q1 <- c(Q1, items)
     
        }
   
     return(Q1)
   
  }

例如这样的数据:

tablero <- data.frame(t1 = c(1,2,3),
                      t2 = c(3,1,2),
                      t3 = c(3,2,1))

我得到这个输出:

Q(1) = 3 1 3 2 1
Q(2) = 3 1 2 3 2
Q(3) = 3 3

问题是我有一个 50.000 行和 7 列的大矩阵,并且该函数太慢并且使用大量内存。在内存使用和速度方面是否有更优化的方式来做同样的事情?

【问题讨论】:

  • 你能用几句话解释一下这个函数在做什么吗?
  • 这个想法是,对于第 1 列 (t1) 中的每个数字,您可以查看该数字所在的其他列。并且您想保留所有高于您正在查看的数字,包括您正在查看的数字。例如,如果你在 t1 中从 1 开始,你去 t2 并看到只有 2 不高于 1,所以你保持 1 和 3。接下来你看到 t3,你看到 2 和 3 在 1 之上,所以你保留 3、2 和 1。所以加入这两个列表你会得到 Q(1) 是一个具有 3、1、3、2 和 1 的向量。

标签: r dataframe matrix


【解决方案1】:

我们可以使用sapplyapply 函数来遍历您的数据。这可能比依赖于for 循环的函数更高效。代码返回一个列表。

sapply(tablero[,1],
       FUN = function(x){
         unlist(apply(tablero[,-1],
                      2,
                      FUN = function(y) y[1:which(y == x)]))
       })

# [[1]]
# t21 t22 t31 t32 t33 
# 3   1   3   2   1 

# [[2]]
# t21 t22 t23 t31 t32 
# 3   1   2   3   2 
 
# [[3]]
# t2 t3 
# 3  3 

【讨论】:

  • 不幸的是,当我使用这部分代码执行大型矩阵时,它并没有提高速度或内存使用率。
猜你喜欢
  • 2018-05-25
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多