2013-09-30 2 views
0

У меня есть два списка списков A и B, A и B содержат по 100 кадров данных, а размер каждого кадра данных - 25000 X 25000. Я хотел бы найти корреляцию для весь кадр данных следующим образом: рассмотрите первый список в обоих списках и найдите cor (A, B) и получите одно значение, сопоставляющее весь блок данных. Аналогично рассмотрите второй список в обоих списках и найдите cor (A, B) и продолжите это для 100 фреймов данных.работает со списком данных в виде списка

Я попытался следующие:

A # list of 100 dataframes 

    $1 ### dataframe 1 
    $2 
    $3 
    .... 
    $100 ### dataframe 100 
    B #list of 100 dataframes 

    $1 ### dataframe 1 
    $2 
    $3 
    .... 
    $100 ### dataframe 100 
    C<- A[1] # extract only the first list from A 
    D<- B[1] # extract only the first list from B 

    C<-unlist(C) ### unlist C 
    D<-unlist(D) ## unlist D 

Затем вычисляется

Correlation<- cor(C,D) ## to obtain a single correlation coefficient to see how these two vectors are correlated   

Но я в конечном итоге с ошибкой Sayin

R cannot allocate a vector of size 3.9 GB 

Есть ли лучший способ сделать это быстрее который может быть реализован во весь список. Я работаю на сервере, который позволяет мне вычислять большие значения, но он по-прежнему обнаруживает эту ошибку, и не-список занимает много времени из-за размера фрейма данных.

+0

Это похоже на проблему с памятью больше всего на свете. Сколько у вас RAM? Каков результат 'object.size (A)'? Что такое вывод 'gc()'? – mrip

ответ

1

Несколько вопросов здесь. Прежде всего, фреймворк данных может не быть хорошим представлением для матриц размером 25000x25000. Кадры данных обычно имеют небольшое количество столбцов и большое количество строк. Если каждый столбец является одним и тем же типом данных (что, по-видимому, имеет место), то, в зависимости от того, что вам нужно делать с данными, вы можете рассмотреть возможность работы с матрицами.

Далее причина unlist занимает много времени, что unlist по-видимому, реализуется по наивности, по существу, с помощью повторных вызовов c() (вы можете проверить источник, чтобы узнать наверняка). Попробуйте вместо этого:

C<-as.vector(as.matrix(C)) 

Это должно принуждать C к матрице более эффективным способом, а затем просто удалить атрибут измерения, и вы получите вектор, который вы ищете.

Далее вы имеете дело с довольно большим набором данных, и ошибка, которую вы получаете, означает, что вы нажимаете пределы имеющейся у вас ОЗУ. Вы получили ошибку памяти во время вызова до unlist или во время вызова cor? Было бы полезно предоставить точный вывод R-терминала.

Я бы предложил попытаться выполнить вычисления, используя as.vector(as.matrix(C)), а не unlist(C) и посмотреть, работает ли это. Если нет, попробуйте сбор мусора (то есть вызовите gc()) между некоторыми вызовами.

Что касается операции со всем списком, вы можете просто использовать mapply. Однако, учитывая, что у вас проблемы с памятью, может быть хорошей идеей сохранить больше контроля над тем, что происходит, написав менее элегантный императивный код. Что-то вроде этого достаточно просто:

corvec<-rep(0,100) 
for(i in 1:100){ 
    gc() 
    C<-as.vector(as.matrix(A[[i]])) 
    D<-as.vector(as.matrix(B[[i]])) 
    corvec[i]<-cor(C,D) 
} 
4

Вы сделали 2 подсписка, но на самом деле не извлекли DataFrame или вектор.

Correlation<- cor(A[[1]][[1]], B[[1]][[1]]) 

Выражение A[[1]] возвращает первый dataframe (если на самом деле объект был, как вы описали его), а затем дополнительный [[1]] возвращает первый столбец в качестве атомного вектора так, чтобы он соответствовал требованиям функции cor , Немного непонятно, что вы подразумеваете под «корреляцией всего кадра данных» или «более быстрым способом, который может быть реализован во весь список». Вы можете использовать lapply() или for -loop для итерации по списку данных или по столбцам данных. Почему бы не составить список из 2 или 3 фреймов данных более скромного размера, и кто-то может показать вам, как сделать один или оба этих метода. Или вы можете прочитать некоторые вводные материалы, такие как «Введение в R».

+0

@ Dwin: Я сейчас редактировал свой вопрос. Что я подразумеваю под «корреляцией для всего кадра данных», так это то, что я хотел бы найти только одно значение коэффициента корреляции двух кадров данных вместо коэффициента корреляции для каждой ячейки в кадре данных. что-то вроде cor (A, B) = 0,65 - это то, что я хотел бы. – user1805343

+3

Вы уклоняетесь от вопроса. Что означает сказать «единый коэффициент корреляции» двух 25000 X 25000 данных? Корреляция определяется между двумя векторами. –

+0

@ DWin <-something like cor (A, B) = 0.65 – user1805343

2

Не прямой ответ, но для решения проблемы памяти, вы можете увеличить оперативную память, выделенной с помощью memory.limit(8000) (8000MB)

Смежные вопросы