我正在将几个文件一起读入数据帧列表,以便能够将函数应用于组合数据,但是当我有太多数据帧时,我遇到内存分配问题("错误:R不能分配内存")。
e.g。读取可变数量的数据帧,现在说3个数据帧:
x = data.frame(A=rnorm(100), B=rnorm(200))
y = data.frame(A=rnorm(30), B=rnorm(300))
z = data.frame(A=rnorm(20), B=rnorm(600))
listDF <- list(x,y,z)
错误:R无法分配内存
我想知道这里是否有人知道例如[数组或具有多列的单个数据帧]是否是存储和操作数据帧的更有效方式。
数据帧列表是一种非常实用的方法,因为我可以根据数据帧的名称操作数据中的许多列,在处理可变数量的数据帧时这很方便。无论如何,如果您有任何想法/任何方式,请分享他们:)谢谢!
答案 0 :(得分:1)
这个解决方案可能并不理想,因为它不是免费的,但Revolution R Enterprise旨在处理R中的大数据问题。它使用R中的SQL的一些数据操作功能来做得更快对大数据的计算。有一个学习曲线,因为它有不同的功能来处理新的数据类型,但如果你正在处理大数据,速度是值得的。你只需要决定学习它的时间和产品的成本对你来说是否比一些更慢,更笨拙的工作更有价值。
答案 1 :(得分:-1)
DataTables是R中非常有效的数据结构,看看它们对你的情况有用。
答案 2 :(得分:-2)
您的示例并提及apply
函数系列表明数据框架的结构相同,即它们都具有相同的列。
如果是这种情况,并且数据总量(所有数据帧一起)仍然适合可用RAM 那么解决方案可能是将所有数据打包成一个大{{1}带有额外的id列。这可以通过函数data.table
实现:
rbindlist
源自各个源数据帧的行
可以通过library(data.table)
x <- data.table(A = rnorm(100), B = rnorm(200))
y <- data.table(A = rnorm(30), B = rnorm(300))
z <- data.table(A = rnorm(20), B = rnorm(600))
dt <- rbindlist(list(x, y, z), idcol = TRUE)
dt
.id A B
1: 1 -0.10981198 -0.55483251
2: 1 -0.09501871 -0.39602767
3: 1 2.07894635 0.09838722
4: 1 -2.16227936 0.04620932
5: 1 -0.85767886 -0.02500463
---
1096: 3 1.65858606 -1.10010088
1097: 3 -0.52939876 -0.09720765
1098: 3 0.59847826 0.78347801
1099: 3 0.02024844 -0.37545346
1100: 3 -1.44481850 -0.02598364
变量来回避。所有内存效率.id
操作都可以应用于所有行,选定行(data.table
)或分组(dt[.id == 1, some_function(A)]
)。
尽管dt[, another_function(B), by = .id]
操作具有内存效率,但RAM可能仍然是一个限制因素。使用data.table
函数监视所有已创建的tables()
对象的内存消耗:
data.table
并从内存中删除不再需要的对象
tables()
NAME NROW NCOL MB COLS KEY
[1,] dt 1,100 3 1 .id,A,B
[2,] x 200 2 1 A,B
[3,] y 300 2 1 A,B
[4,] z 600 2 1 A,B
Total: 4MB