Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 传播非常长的数据集-性能问题_R_Performance_Dplyr_Spread - Fatal编程技术网

R 传播非常长的数据集-性能问题

R 传播非常长的数据集-性能问题,r,performance,dplyr,spread,R,Performance,Dplyr,Spread,我正试图通过一个具有~2000个唯一值的变量将一个很长的数据帧(17000000行;111.2MB RDS文件)扩展为一个宽格式。在16核64GB RAM linux机器上运行此操作会导致错误:无法分配大小为3132.3GB的向量 下面的dplyr代码可以在较小的数据集(约1/3大小)上完美工作 数据% rowid_到_列()%>% 排列(键=参数\名称,值=值)%>% 选择(-rowid) 有什么办法完成这件事吗?更高效的编码?数据表转换更高效、更快,尽管dplyr更方便 在我看来,您正在尝

我正试图通过一个具有~2000个唯一值的变量将一个很长的数据帧(17000000行;111.2MB RDS文件)扩展为一个宽格式。在16核64GB RAM linux机器上运行此操作会导致
错误:无法分配大小为3132.3GB的向量

下面的
dplyr
代码可以在较小的数据集(约1/3大小)上完美工作

数据%
rowid_到_列()%>%
排列(键=参数\名称,值=值)%>%
选择(-rowid)

有什么办法完成这件事吗?更高效的编码?

数据表转换更高效、更快,尽管dplyr更方便

在我看来,您正在尝试创建17e6 x 2000 data.frame,这是非常不合理的(因为每行只有一个值)

如果您的值为整数,则结果data.frame的大小为:

v <- sample.int(17e6)
format(object.size(v) * 2000, units = 'Gb')
# [1] "126.7 Gb"

v能否提供一些数据来运行代码?您是否尝试过使用{data.table}的等效解决方案?似乎相关:正如@markus'链接中的一条注释所建议的(公平地说,是我的注释):如果您的数据相当大,可能需要
拆分
,分别重塑每个元素,然后以某种方式重新组合。在重新组合时,必须注意确保列和行正确对齐,但这在大范围内是最小的努力。您也可以尝试使用
widyr
v <- sample.int(17e6)
format(object.size(v) * 2000, units = 'Gb')
# [1] "126.7 Gb"
v <- rnorm(17e6)
format(object.size(v) * 2000, units = 'Gb')
# [1] "253.3 Gb"
N <- 200000
n <- 2000
require(data.table)
dt <- data.table(parameter_name = sample.int(n, N, T), value = rnorm(N), id = 1:N)
r <- dcast(dt, id ~ parameter_name)
format(object.size(r), units = 'Gb')
# [1] "3 Gb"