当我需要处理原始数据或生成大量合成数据时,我在Python中使用pytables并遍历每一行并将该行“附加”到表中。所以我不必事先知道桌子的大小。例如,
import tables
class test(tables.IsDescription):
col1 = tables.Int32Col()
col2 = tables.Int32Col()
hdf5_a = tables.openFile('test.hdf5', 'a')
table = hdf5_a.createTable('/', 'test', test)
for i in range(10):
table.row['col1'] = i
table.row['col2'] = i * 10
table.row.append()
table.flush()
hdf5_a.close()
我需要用R做同样的事情。基本上我想要:
我认为ff
和bigmemory
这样的包应该对此有用,但我看到的例子与我的需求有点不同。是否有任何代码片段在R中执行类似的操作?我认为一个简单的代码示例将非常有用。
答案 0 :(得分:1)
R中的方法是相同的 - 打开文件进行写入,附加块,关闭文件。如果您熟悉HDF5,则rhdf5是一种选择。包vignette在第3.3节中包含了创建文件的迭代的明确示例。关键是有效地执行此操作是以块的形式写入 - 多行以利用R的有效矢量 - 而不是一次使用单行。但你也可以一次写一行。
答案 1 :(得分:1)
首先是一个生成一些数据的函数
gendata <- function() {
n <- 1E3
data.frame(a = 1:n, b = rnorm(n), c = sample(letters, n, replace=TRUE))
}
ff
+ ffbase
对于ff
,可以使用以下模式:
library(ffbase)
dat <- NULL
for (i in seq_len(10)) {
d <- gendata()
dat <- ffdfappend(dat, d)
}
save.ffdf(dat, dir="./test")
可以使用load.ffdf("./test")
再次加载数据。
对于test / csv文件,可以使用以下模式:
con <- file("test.csv", "wt")
first_block <- TRUE
for (i in seq_len(10)) {
d <- gendata()
write.table(d, file=con, sep=",", row.names=FALSE, col.names=first_block)
first_block <- FALSE
}
close(con)
要使用它,您首先必须将其导入ff
或bigmemory
,或者您可以使用LaF
使用它(只读)。