如何在R中创建一个大型数据框,无论是否先创建矩阵,然后将其转换为data.frame?

Dat*_*erd 8 r matrix dataframe

我需要创建一个包含80000行和80000列的矩阵.但是,在阅读了Rbloggers后,我知道,矩阵中的元素数量不能超过2 ^ 31 - 1.我为我的特定算法避免这个问题的计划是使用数据框而不是矩阵.有没有办法我可以创建一个80000 x 80000的空数据框,而无需先创建一个矩阵,然后使用as.data.frame将其转换为data.frame,如下所示?

myMatrix <- matrix(0, ncol = 40, nrow = 90)
myDataFrame <- as.data.frame(myMatrix)
Run Code Online (Sandbox Code Playgroud)

jos*_*ber 4

您可以构建一个大小为 80,000 x 80,000 的空数据框,如下所示:

dat <- do.call(data.frame, replicate(80000, rep(FALSE, 80000), simplify=FALSE))
dim(dat)
# [1] 80000 80000
dat[1,1]
# [1] FALSE
dat[80000,80000]
# [1] FALSE
Run Code Online (Sandbox Code Playgroud)

replicate基本上,您构建一个包含要构建的数据框的每一列的列表(我使用with构建了列表simplify=FALSE),然后您使用do.calldata.frame函数构建了一个数据框。

一些注意事项:

  1. 您最好有几十 GB 的内存,才有机会将其放入计算机的内存中(我的 R 进程显示分配的内存为 48 GB)。
  2. 这会比矩阵分配慢很多;对于 8000 x 8000 的情况,数据帧构建需要 36 秒,矩阵构建需要 1 秒。整个数据帧的分配花费了 54 分钟。
  3. 如果您的数据稀疏,这是一个浪费的选择,您应该使用稀疏矩阵。

尽管在 64 位 Linux(R 版本 3.2.0)中分配这种大小的矩阵并没有失败,但基本操作似乎不起作用:

x <- matrix(0, nrow=80000, ncol=80000)
dim(x)
# [1] 80000 80000
x[1,1]
# Error: long vectors not supported yet: subset.c:733
Run Code Online (Sandbox Code Playgroud)