我有两个列表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
是否有更好的方法以更快的方式执行此操作,可以将其实施到整个列表中。我在服务器上工作,它允许我计算大值,但它仍然显示此错误,并且由于数据帧的大小,未列出需要很长时间。
答案 0 :(得分:4)
您制作了2个子列表,但实际上并未提取数据框或矢量。
Correlation<- cor(A[[1]][[1]], B[[1]][[1]])
表达式A[[1]]
返回第一个数据帧(如果事实上对象就像你描述的那样),然后附加的[[1]]
将第一列作为原子向量返回,以便它符合要求cor
函数。通过“整个数据框架的相关性”或“可以对整个列表实施的更快的方式”,你有点不清楚是什么意思。您可以使用lapply()
或for
循环来迭代数据帧列表或数据帧列。为什么不列出2或3个更适中的数据框,有人可以告诉你如何做这些方法中的一个或两个。或者您可以阅读一些介绍性材料,例如“R简介”。
答案 1 :(得分:2)
不是直接的答案,但为了解决内存问题,您可能希望增加使用memory.limit(8000)
(8000MB)分配的RAM
答案 2 :(得分:1)
这里有一些问题。首先,对于大小为25000x25000的矩阵,数据帧可能不是一个好的表示。数据帧通常具有少量列和大量行。如果每个列都是相同的数据类型(似乎是这种情况),那么,根据您需要对数据执行的其他操作,您可能会考虑使用矩阵。
接下来,unlist
需要很长时间的原因是unlist
似乎天真地实现,主要是使用重复调用c()
(您可以检查来源以确定)。试试这个:
C<-as.vector(as.matrix(C))
这应该以更有效的方式将C强制转换为矩阵,然后简单地删除维度属性,您将得到您正在寻找的向量。
接下来,您正在处理一个相当大的数据集,而您所获得的错误意味着您正在推动您可用的RAM限制。在致电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)
}