2013-06-16 6 views
3

У меня есть большой размер кадра данных (40000 наблюдений 800 переменных) и вы хотите работать с диапазоном столбцов каждого наблюдения с чем-то похожим на точечный продукт. Вот как я его реализовал:R-Операция на подмножестве столбцов из dataframe с ddply

matrixattempt <- as.matrix(dframe) 
takerow <- function(k) {as.vector(matrixattempt[k,])} 
takedot0 <- function(k) {sqrt(sum(data0averrow * takerow(k)[2:785]))} 

for (k in 1:40000){ 
print(k) 
dframe$dot0aver[k]<-takedot0(k) 
} 

Печать предназначена только для отслеживания происходящего. data0averrow - числовой вектор, такой же размер, как takerow (k) [2: 785], который был предварительно определен.

Это работает, и из нескольких тестов работает правильно, но это очень медленно.

Я искал точечный продукт для подмножества столбцов и нашел this question, но не смог понять, как применить его к моей настройке. ddply звучит так, как будто он должен работать быстрее (хотя я не хочу делать расщепление и должен использовать тот же трюк идентификатора id, что и упомянутый вопроситель). Любые идеи/подсказки?

+1

Если ни один из этих ответов не работает, вам действительно нужно решить эту проблему с помощью небольшого тестового примера, например, 8 x 10 матриц? –

+0

@ Ответ Аруна работал хорошо. Спасибо. – zdilli

ответ

2

Попробуйте это:

sqrt(colSums(t(matrixattempt[, 2:785]) * data0averrow)) 

или эквивалентно:

sqrt(matrixattempt[, 2:785] %*% data0averrow) 
+0

Оба они работали довольно быстро. Спасибо. Я попробовал строку с% *%, прежде чем я написал цикл for, но порядок был отменен (или что-то еще не так в том, как я его настроил), так что это давало мне то же значение для каждой строки. – zdilli

2

Использование умножения матриц и rowSums на результат:

dframe$dot0aver <- NA 
dframe$dot0aver[2:785] <- sqrt(rowSums( 
           matrixattempt[2:785,] %*% data0averrow)) 

Это SQRT дот-продукт data0aver с каждой строки в диапазоне

+0

Не уверен, но я считаю, что RHS должен быть 'matrixattempt [, 2: 785]% *% ...'? И я думаю, вам не нужен 'rowSums'. – Arun

+0

Не уверен. Я думал, что он хотел бы, чтобы строки 2: 785 умножались на вектор той же длины, что и количество столбцов. Я отредактировал свой ответ, чтобы подумать, что с тех пор, как у моего первого усилия была ошибка, или два –

+0

а теперь я вижу, что вы имеете в виду и почему вам нужен rowSums. Но я вижу следующее: возьмите для каждой k строку 'k'th' matrixattempt' с столбцами '2: 785' и умножьте ее на' data0averrow'. – Arun