Эффективный способ сравнения данных в матрице

#r #dataframe #matrix

#r #фрейм данных #матрица

Вопрос:

У меня следующая проблема. Я должен сравнить данные в матрице (datatable или dataframe), используя следующую функцию:

 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. Не могли бы вы объяснить в нескольких словах, что делает функция?

2. Идея заключается в том, что для каждого числа в столбце 1 (t1) вы просматриваете другие столбцы, где находится это число. И вы хотите сохранить все числа, которые выше того, которое вы просматриваете, включая то, которое вы видите. Например, если вы начинаете с 1 в t1, вы переходите к t2 и видите, что только 2 не выше 1, поэтому вы сохраняете 1 и 3. Затем вы видите t3 и видите, что 2 и 3 выше 1, поэтому вы сохраняете 3, 2 и 1. Итак, присоединяясьв обоих списках вы получаете, что Q (1) является вектором с 3, 1, 3, 2 и 1.

Ответ №1:

Мы можем использовать функции sapply и apply для перебора ваших данных. Это может быть более производительным, чем ваша функция, которая полагается на 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 
 

Комментарии:

1. К сожалению, когда я выполнил код с этой частью для большой матрицы, это не улучшило скорость или использование памяти.