6

巨大な m*n 行列X(メモリに読み込むには大きすぎる) とVlengthのバイナリ数値ベクトルがあるとしmます。私の目的は、equalingXに対応する(および に対応するものではない) の行を専用の/などのパッケージ(ただし必ずしも同一ではない)またはに読み込むことです。に対応する行のみ。V1V[i] == 0data tablematrixbigmemoryffV[i] == 1

これは、ハッキングnrowsなどskipで行うことができますが、他read.tableを探しています。RAM が不足しているため、タイプ ソリューション。bigmemoryff

my の実際のサイズを反映していない 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"?
4

4 に答える 4

3

コマンドラインツールを使用して、コマンド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、ヘッダー行を構成する行を考慮してオフセットされていることに注意してください。

于 2013-10-22T09:25:36.427 に答える
1

ffdfindexgetパッケージからffあなたが探しているものです:

関数 ffdfindexget を使用すると、ff ベクトルに格納された正の整数添え字に従って、ffdf data.frame から行を抽出できます。

あなたの例では:

write.csv(X,"target.csv")
d <- read.csv.ffdf(file="target.csv")
i <- ff(which(V==1))
di <- ffdfindexget(d, i)
于 2013-10-22T09:24:11.307 に答える
0

sqldfパッケージを 使用して、目的を達成できると思います。sqldfR環境を完全にバイパスして、csvファイルをSQLliteデータベースに直接読み込みます。

library(sqldf)

Xfile <- file('target.csv')
sqlcmd <- paste0('select * from Xfile where rowid in (', paste(which(V==1), collapse=','), ')')
sqldf(sqlcmd, file.format=list(header=TRUE))

また:

library(sqldf)

Vdf <- data.frame(V)
sqlcmd <- "select file.* from file, Vdf on file.rowid = Vdf.rowid and V = 1"
read.csv.sql("target.csv", sql = sqlcmd)
于 2013-10-22T09:33:00.517 に答える
0

実行可能な戦略は、CSV ファイルをデータベースにインポートすることです (R はそれらのほとんどへの接続をサポートしています。最先端を感じていて速度が重要な場合は MonetDB を使用してください。それ以外の場合は、SQLite などの便利なものを使用してください)。

次に、SQL を使用して適切なサブセットを指定し、それを R に読み込むことができます。

于 2013-10-22T09:30:48.280 に答える