#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. К сожалению, когда я выполнил код с этой частью для большой матрицы, это не улучшило скорость или использование памяти.