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         

但我最终得到了错误说

  R cannot allocate a vector of size 3.9 GB

是否有更好的方法以更快的方式执行此操作,可以对整个列表实施。我在允许我计算大值的服务器上工作,但它仍然显示此错误,并且由于数据框的大小,取消列出需要很长时间。

4

3 回答 3

4

您制作了 2 个子列表,但实际上并未提取数据框或向量。

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

该表达式A[[1]]返回第一个数据帧(如果实际上该对象与您描述的一样),然后附加[[1]]返回第一列作为原子向量,以便它符合cor函数的要求。有点不清楚您所说的“整个数据帧的相关性”或“可以对整个列表实施的更快方式”是什么意思。您可以使用lapply()or for-loop 来迭代数据框列表或数据框的列。为什么不列出 2 或 3 个大小更适中的数据框,有人可以向您展示如何使用其中一种或两种方法。或者您可以阅读一些介绍性材料,例如“R 简介”。

于 2013-09-30T06:45:24.713 回答
2

不是直接的答案,但要解决内存问题,您可能需要使用memory.limit(8000)(8000MB)增加分配的 RAM

于 2013-09-30T07:08:13.000 回答
1

这里有几个问题。首先,对于大小为 25000x25000 的矩阵,数据框可能不是很好的表示。数据框通常具有少量的列和大量的行。如果每一列都是相同的数据类型(似乎是这种情况),那么根据您需要对数据执行的其他操作,您可能会考虑只使用矩阵。

接下来,unlist需要很长时间的原因是它unlist似乎是幼稚的实现,本质上是使用重复调用c()(您可以检查源代码以确定)。试试这个:

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

这应该以更有效的方式将 C 强制转换为矩阵,然后简单地删除维度属性,您将获得您正在寻找的向量。

接下来,您正在处理一个相当大的数据集,并且您得到的错误意味着您正在突破可用 RAM 的限制。unlist您是否在调用 to期间或在调用 to 期间收到内存错误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)
}
于 2013-09-30T12:31:44.437 回答