2017-10-10 11 views
0

readMat()を使用してRに複数のデータ構造を* .matファイルとして保存する際に問題が発生しています。Rが大量の負の乱数に変換されています

Rでファイルを読み込んで開くと、データ構造に格納されている1つの列の内容が(明らかに)ランダムに変更されます(たとえば、1504615865460506で-1372641510)。また、元の* .matファイルの数字は増加しています(1番目は1484649519139343、2番目は1484649519142687など)。対応する数字は減少しています(1番目は-1372641510、2番目は-1372633137など)。他の変数には変更は起こっていません。

"wronged"変数は、データポイントが記録された正確な時刻を示すプログレッシブ数値であるTimeStampです。これは、リストの一部である列に格納され、さらに大きなリストの一部になります。 class()によると 'integer'です。 readMat()のドキュメントを読みましたが、関連するものは見つかりませんでした。問題が多かった場合は、オプション(数字= 20)を設定し、効果はありません。

どのようなアイデアや提案をいただければ幸いです!

私のコードを添付します。

library(R.matlab) 
setwd("C:/Path") 
options(digits=20) 
temp = list.files(pattern="*.mat") 
list2env(lapply(setNames(temp, make.names(gsub("*.mat$", "", temp))), readMat), envir = .GlobalEnv) 
rm(temp) 
listAll<-list(mget(ls())) #listAll contains all the *.mat files. 



listAll[[1]][[3]] #listAll contains N lists == N of *.mat files. 

これは、第3リストの構成の一例である:

# $data 
# , , 1 
# 
# [,1] 
# ID   "A6001" 
# TimePoint "10" 
# MainBuffer List,12 
# TimeBuffer List,12 #TimeBuffer is the Time Stamp. 

TimeBuffer 12回の試験に対応し、12件のリストを含んでいます。各試行には1つの列があり、これはプロセスで不本意に変更される列です。

# EventBuffer List,12 
# Log   List,12 
# 
# 
# attr(,"header") 
# attr(,"header")$description 
# [1] "MATLAB 5.0 MAT-file, Platform: MACI64, Created on: Wed Sep 20 16:03:45 2017           " 
# 
# attr(,"header")$version 
# [1] "5" 
# 
# attr(,"header")$endian 
# [1] "little" 

listAll[[1]][[3]][[1]][[4]][[3]][[1]][1,][1] 

#[1] 668725504 (and should be 1480500650907453) 
+1

1504615865460506は、Rの有効な整数の範囲外です。追加のサイズの64ビット整数を利用できるようにする 'bit64'パッケージをチェックしてください。 – Mako212

+0

値を変更する「ちょうどR」の場合は、単純に整数ではなく倍精度に変換すると予想されます。他に奇妙なことが起こっているという事実は、R.matlabパッケージのコードが他の特定の方法でそれらを誤って扱っていることを示唆しています。 – joran

答えて

1

1504615865460506よく、例えば

-1372641510であるべきでオーバーフローエラーのように見えます。 Rにおけるhelp(integer)から

Rの現在の実装では、整数ベクトルの32ビット整数を使用することに注意してください、そう表現整数の範囲は、約+/- 2 * 10^9に限定されます。 'doubleはより大きな整数を正確に保持できます。

したがって、問題の値にはdoubleなどの大きな型を使用する必要があります。

+0

ありがとう、これは問題でした。しかし、私はreadMatでこれを達成する方法はないと思う(またはそれは私にとってはあまりにも多い)。私は別のパッケージrmatioを使用しようとし、代替関数read.mat()でループを繰り返しました。今、数字は正しい!私はすべての私の1492686487679232s、class()の '数値'を持っています。 – TDB

関連する問題