Возвращаемое значение из столбца, указанного в той же строке - PullRequest
3 голосов
/ 07 июля 2010

Я застрял в простом цикле, который занимает больше часа, и мне нужна помощь, чтобы ускорить его.

По сути, у меня есть матрица с 31 столбцом и 400 000 строк.Первые 30 столбцов имеют значения, а 31-й столбец имеет номер столбца.Мне нужно для каждой строки извлечь значение в столбце, указанном в 31-м столбце.

Пример строки: [26,354,72,5987 .., 461,3] (это означает, что значение в столбце 3(72))

Слишком медленный цикл выглядит следующим образом:

a <- rep(0,nrow(data)) #To pre-allocate memory
for (i in 1:nrow(data)) {
   a[i] <- data[i,data[i,31]]
}

Я думаю, это будет работать:

a <- data[,data[,31]]

... ноэто приводит к «Ошибка: невозможно выделить вектор размером 2,8 Мб».

Боюсь, что это действительно простой вопрос, поэтому я потратил часы, пытаясь понять, применять, удовлетворять, изменять форму и многое другое, нопочему-то я не могу понять концепцию векторизации в R.

В матрице на самом деле есть еще больше столбцов, которые также входят в a-параметр, поэтому я не хочу перестраивать матрицу,или разделите его.

Ваша поддержка высоко ценится!

Крис

Ответы [ 3 ]

2 голосов
/ 07 июля 2010
t(data[,1:30])[30*(0:399999)+data[,31]]

Это работает, потому что вы можете ссылаться на матрицы как в формате массива, так и в векторном формате (вектор длиной 400000 * 31), считая сначала по столбцам. Для подсчета строк вы используете транспонирование.

0 голосов
/ 07 июля 2010

Попробуйте изменить код для работы со столбцом за раз:

M <- matrix(rpois(30*400000,50),400000,30)
MM <- cbind(M,apply(M,1,which.max))
a <- rep(0,nrow(MM))
for (i in 1:(ncol(MM)-1)) {
    a[MM[, ncol(MM)] == i] <- MM[MM[, ncol(MM)] == i, i]
}

Это устанавливает все элементы в a со значениями из столбца i , еслипоследний столбец имеет значение i .Построение матрицы заняло больше времени, чем вычисление вектора a .

0 голосов
/ 07 июля 2010

Единственная индексация матрицы для матрицы может использовать меньше памяти. Это будет включать в себя что-то вроде:

i <- nrow(data)*(data[,31]-1) + 1:nrow(data)
a <- data[i]

Ниже приведен пример одноиндексного обозначения для матриц в R. В этом примере индекс максимума для каждой строки добавляется в качестве последнего столбца случайной матрицы. Этот последний столбец затем используется для выбора максимума для каждой строки с помощью одноиндексной записи.

## create a random (10 x 5) matrix                                                                                                                           
M <- matrix(rpois(50,50),10,5)
## use the last column to index the maximum value of the first 5                                                                                             
## columns                                                                                                                                                   
MM <- cbind(M,apply(M,1,which.max))
##             column ID          row ID                                                                                                                     
i <- nrow(MM)*(MM[,ncol(MM)]-1) + 1:nrow(MM)
all(MM[i] == apply(M,1,max))

Использование индексной матрицы - это альтернатива, которая, вероятно, будет использовать больше памяти, но немного понятнее:

ii <- cbind(1:nrow(MM),MM[,ncol(MM)])
all(MM[ii] == apply(M,1,max))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...