代码之家  ›  专栏  ›  技术社区  ›  user1805343

使用数据帧列表作为列表

  •  0
  • user1805343  · 技术社区  · 11 年前

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

    有没有更好的方法可以更快地做到这一点,并可以在整个列表中实现。我在一台允许我计算大值的服务器上工作,但它仍然显示这个错误,并且由于数据帧的大小,取消列表需要很长时间。

    3 回复  |  直到 11 年前
        1
  •  4
  •   IRTFM    11 年前

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

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

    表达式 A[[1]] 返回第一个数据帧(如果对象实际上与您描述的一样),然后返回附加的 [[1]] 将第一列作为原子向量返回,以便它与 cor 作用您所说的“整个数据帧的相关性”或“可以实现到整个列表的更快方法”是什么意思,这有点不清楚。您可以使用 lapply() for -循环以在数据帧的列表或数据帧的列上进行迭代。为什么不列出2或3个大小适中的数据帧,有人可以向你展示如何使用其中一种或两种方法呢。或者你可以阅读一些入门材料,比如“R入门”。

        2
  •  2
  •   sachinruk    11 年前

    不是直接的答案,但为了解决内存问题,您可能需要使用 memory.limit(8000) (8000毫巴)

        3
  •  1
  •   mrip    11 年前

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

    接下来,原因 unlist 需要很长时间吗 未列入名单 似乎是天真地实现的,本质上是使用对的重复调用 c() (您可以查看来源以确定)。请尝试以下操作:

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

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

    接下来,您要处理一个相当大的数据集,而您得到的错误意味着您正在突破可用RAM的极限。你在打电话给的过程中出现内存错误了吗 未列入名单 或在呼叫期间 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)
    }