读取大型矩阵数据文件的特定行

标签 r memory memory-management matrix io

假设我有一个巨大的 m*n 矩阵 X (太大而无法读入内存)和二进制数值向量 V带长度m .我的目标是读取 X 的行对应于 V等于 1 (而不是对应于 V[i] == 0 的那些)转换为专用的 data table/matrix通过一个包,例如(但不一定相同)bigmemoryff .仅适用于 V[i] == 1 对应的行.

这可以通过黑客攻击来完成 nrowsskip以此类推 read.table但我正在寻找 bigmemory , ff等。由于 RAM 不足而键入解决方案。

这是一个不能反射(reflect)我的真实大小的 MWE X .

X <- array(rnorm(100*5),dim=c(100,5))
write.csv(X,"target.csv")
V <- sample(c(rep(1,50),rep(0,50))) #Only want to read in half the rows corresponding to 1's
rm(X)

#Now ... How to read "target.csv"?

最佳答案

你用命令行工具如何sed , 构建一个命令,该命令沿您要在命令中读取的行传递。我不确定是否会有一些命令长度限制......

#  Check the data
head( X )
#           [,1]        [,2]       [,3]       [,4]        [,5]
#[1,]  0.2588798  0.42229528  0.4469073  1.0684309  1.35519389
#[2,]  1.0267562  0.80299223 -0.2768111 -0.7017247 -0.06575137
#[3,]  1.0110365 -0.36998260 -0.8543176  1.6237827 -1.33320291
#[4,]  1.5968757  2.13831188  0.6978655 -0.5697239 -1.53799156
#[5,]  0.1284392  0.55596342  0.6919573  0.6558735 -1.69494827
#[6,] -0.2406540 -0.04807381 -1.1265165 -0.9917737  0.31186670

#  Check V, note row 6 above should be skipped according to this....
head(V)
# [1] 1 1 1 1 1 0

#  Get line numbers we want to read
head( which( V == 1 ) )
# [1] 1 2 3 4 5 7

#  Read the first 5 lines where V == '1' in your example (remembering to include an extra line for the header row, hence the +1 in 'which()')
read.csv( pipe( paste0("sed -n '" , paste0( c( 1 , which( V == 1 )[1:6] + 1 ) , collapse = "p; " ) , "p' C:/Data/target.csv" , collapse = "" ) ) , head=TRUE)

#  X        V1         V2         V3         V4          V5
#1 1 0.2588798  0.4222953  0.4469073  1.0684309  1.35519389
#2 2 1.0267562  0.8029922 -0.2768111 -0.7017247 -0.06575137
#3 3 1.0110365 -0.3699826 -0.8543176  1.6237827 -1.33320291
#4 4 1.5968757  2.1383119  0.6978655 -0.5697239 -1.53799156
#5 5 0.1284392  0.5559634  0.6919573  0.6558735 -1.69494827
#6 7 0.6856038  0.1082029  0.1523561 -1.4147429 -0.64041290

我们实际上传递给 sed 的命令是...
 "sed -n '1p; 2p; 3p; 4p; 5p; 6p; 8p' C:/Data/target.csv"

我们使用 -n关闭任何行的打印,然后我们使用由 which( V == 1 ) 提供给我们的我们想要读取的行号的分号分隔向量。 ,最后是目标文件名。请记住,这些行号已被 +1 偏移。考虑构成标题行的行。

关于读取大型矩阵数据文件的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19513191/

相关文章:

R - 带加权词的字符串距离

c++ - 使用 ReadProcessMemory 读取 std::map<string, string>

java - 解析 XML 文件时如何测试内存限制

mysql - VARCHAR 列是如何实现的?它们是实际的字符数组吗?

memory-management - Linux 是否对页目录和页表使用自映射?

r - 与 data.tables 的非连接

r - 关于操作数据框的基本 R 问题

r - 在同一图中绘制多个 corrplots (R)

c - C 中的变量存储在内存的什么位置?

c++ - 零大小数组分配是什么/意味着什么?