2017-10-10 1 views
0

R로 가져올 때 readMat()를 사용하여 * .mat 파일로 저장된 여러 데이터 구조를 가져올 때 문제가 있습니다.R이 음수의 난수로 바뀌고 있습니다.

R에서 파일을 읽고 열 때 데이터 구조에 저장된 하나의 단일 열의 내용이 (명백히) 무작위로 변경됩니다 (예 : 1504615865460506이어야하며 -1372641510). 또한 원래 * .mat 파일의 숫자는 증가하고 있습니다 (1 번째는 1484649519139343, 2 번째는 1484649519142687 등). R에서는 해당 숫자가 감소합니다 (1 번째는 -1372641510, 2 번째는 -1372633137 등). 다른 변수에는 변경이 일어나지 않습니다.

"wronged"변수는 데이터 포인트가 기록 된 정확한 시간을 나타내는 점진적 숫자 인 TimeStamp입니다. 목록의 일부인 열에 저장되며 더 큰 목록의 일부입니다. 클래스()에 따라 '정수'입니다. 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"인 경우 단순히 정수가 아닌 double 값으로 변환하는 것이 좋습니다. 다른 이상한 일이 일어나고 있다는 사실은 나에게 R.matlab 패키지의 코드가 다른 특정 방식으로 잘못 처리되고 있음을 암시합니다. – joran

답변

1

는 1,504615865460506하고

오버플로 오류 같은데 예이다 -1372641510한다. R에서 help(integer) 가입일

:

R 현재 구현 정수 벡터에 대한 32 비트 정수를 사용한다는 점에 유의 표현할 정수 범위는 약 +/- 2 * 10^9로 제한된다 double은 훨씬 더 큰 정수를 정확하게 저장할 수 있습니다.

따라서이 값에는 double과 같은 더 큰 유형을 사용해야합니다.

+0

고맙습니다. 이것이 문제였습니다. 그러나 readMat을 사용하여이를 달성하는 방법은 없다고 생각합니다. 다른 패키지 rmatio를 사용하려고 시도하고 대체 함수 read.mat()를 사용하여 루프를 반복했습니다. 자, 숫자가 맞습니다! 내 모든 1492686487679232s 클래스() '숫자'있어요. – TDB

관련 문제