【问题标题】:working with a list of dataframes as a list使用数据框列表作为列表
【发布时间】:2013-09-30 06:34:56
【问题描述】:

我有两个列表 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

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

【问题讨论】:

  • 这似乎更像是一个内存问题。你有多少内存? object.size(A) 的输出是什么? gc() 的输出是什么?

标签: r correlation


【解决方案1】:

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

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

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

【讨论】:

  • @Dwin:我现在已经编辑了我的问题。我所说的“整个数据帧的相关性”的意思是我只想找到两个数据帧的单个相关系数值,而不是数据帧中每个单元格的相关系数。我想要像 cor ( A, B) = 0.65 这样的东西。
  • 你在回避这个问题。说两个 25000 X 25000 数据帧的“单一相关系数”是什么意思?相关性是在两个向量之间定义的。
  • @DWin
  • 我放弃了。你不是为了意义而阅读。您要求的是数学上没有明确定义的东西。
  • 要使用for循环对列表元素进行索引,您可以将索引变量放在第一个“[[.]]”中,而如果要对列进行索引,则将其放在第二 ”[[。]]”。如果要对行进行索引,则需要使用“[i, ]”代替第二个“[[.]]”进行索引。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这里有几个问题。首先,对于大小为 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)
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多