web-dev-qa-db-ja.com

Rで行ごとに読む良い方法は何ですか?

各行が特定の実験の複製で収集された結果のセットであるファイルがあります。各実験の結果の数(つまり、各行の列の数)は異なる場合があります。各行の結果の順序にも重要性はありません(行1の最初の結果と最初の結果2は、他のどのペアよりも関連性がありません。これらはsetsの結果)。

ファイルは次のようになります。

_2141 0 5328 5180 357 5335 1 5453 5325 5226 7 4880 5486 0 
2650 0 5280 4980 5243 5301 4244 5106 5228 5068 5448 3915 4971 5585 4818 4388 5497 4914 5364 4849 4820 4370
2069 2595 2478 4941 
2627 3319 5192 5106 32 4666 3999 5503 5085 4855 4135 4383 4770 
2005 2117 2803 2722 2281 2248 2580 2697 2897 4417 4094 4722 5138 5004 4551 5758 5468 17361 
1914 1977 2414 100 2711 2171 3041 5561 4870 4281 4691 4461 5298 3849 5166 5578 5520 4634 4836 4905 5105 5089
2539 2326 0 4617 3735 0 5122 5439 5238 1
25 5316 21173 4492 5038 5944 5576 5424 5139 5184 5 5096 4963 2771 2808 2592 2
4963 9428 17152 5467 5202 6038 5094 5221 5469 5079 3753 5080 5141 4097 5173 11338 4693 5273 5283 5110 4503 51
2024 2 2822 5097 5239 5296 4561 
_

ただし、各行がはるかに長い(最大数千の値)場合を除きます。ご覧のとおり、すべての値は非負の整数です。

簡単に言うと、これは通常のテーブルではなく、列に意味があります。その結果はほんの一群です-それぞれが一列に並んでいます。

すべての結果を読んでから、ecdfの計算など、各実験(行)でいくつかの操作を行います。また、すべての複製の平均ecdfを計算したいと思います。

私の問題-この奇妙な見た目のファイルはどうやって読むべきですか?私は_read.table_に非常に慣れているので、他に何か試したことはありません... readlinesのような低レベルを使用する必要がありますか?優先出力は、ベクトルのリスト(またはベクトル?)になると思います。 scanを見ましたが、すべてのベクトルは同じ長さでなければなりません。

任意の提案をいただければ幸いです。

[〜#〜] update [〜#〜]以下の提案に従って、私は今このようなことをします:

_con <- file('myfile') 
open(con);
results.list <- list();
current.line <- 1
while (length(line <- readLines(con, n = 1, warn = FALSE)) > 0) {
 results.list[[current.line]] <- as.integer(unlist(strsplit(line, split=" ")))
 current.line <- current.line + 1
} 
close(con)
_

動作しているようです。それは大丈夫に見えますか?

summary(results.list)を取得するとき:Lengthクラスモード

_      Length Class  Mode  
 [1,] 1091   -none- numeric
 [2,] 1070   -none- numeric
   ....
_

クラスは整数ではありませんか?そして、モードは何ですか?

40
David B

ジョシュにリンクされている例は、私がいつも使用しているものです。

inputFile <- "/home/jal/myFile.txt"
con  <- file(inputFile, open = "r")

dataList <- list()
ecdfList <- list()

while (length(oneLine <- readLines(con, n = 1, warn = FALSE)) > 0) {
    myVector <- (strsplit(oneLine, " "))
    myVector <- list(as.numeric(myVector[[1]]))
    dataList <- c(dataList,myVector)

    myEcdf <- ecdf(myVector[[1]])
    ecdfList <- c(ecdfList,myEcdf)

  } 

close(con)

サンプルを編集して、サンプルデータから2つのリストを作成しました。 dataListは、リスト内の各項目がテキストファイルの各行からの数値のベクトルであるリストです。 ecdfListは、各要素がテキストファイルの各行のecdfであるリストです。

Nullなどが原因でecdfを作成できない状況を適切に処理するには、おそらくtry()またはtrycatch()ロジックを追加する必要があります。しかし、上記の例はあなたをかなり近づけるはずです。幸運を!

29
JD Long

はい、readLinesを使用できます。 JD Longには良い例があります 。これを少し編集して、以下に示します。

con  <- file(inputFile, open = "r")

while (length(oneLine <- readLines(con, n = 1, warn = FALSE)) > 0) {
  # do stuff
} 

close(con)
19
Joshua Ulrich

なぜ行ごとの読み取りに煩わされるのですか?

_results.list <- lapply(strsplit(readLines("myfile")," "), as.integer)
_

整数ベクトルのリストを提供します。

追加の質問について:_?mode_(略して-modeは数値の場合、typeofは整数または倍精度、class数値または整数)。整数があるかどうかを確認するには、str(results.list)またはlapply(results.list, class)を確認してください。

8
Marek

または:

df <- read.delim(file="whatever", header=F, sep = " ")
5

使用する

_line <- readLines(con, 1)
_

接続conから1行を読み取ります。これはcon <- file(filename, "r")と同じくらい簡単です。

2

ファイル内の値が整数であることを知っている場合は、scan()の代わりにreadLines()を使用できますが、ループ内でも使用できます。

open(con)
results.list <- list();
current.line <- 1
while( length(line <- scan(con,what=integer(0),nlines=1,quiet=TRUE))>0 ) {
  results.list[[current.line]] <- line
  current.line <- current.line + 1
}
close(con)

数値ベクトルのリストを取得します。

1
hatmatrix