2014-05-19 3 views
1

내 작업 공간 (.mat 파일에서로드 됨)에 많은 대형 데이터 세트 배열이 있습니다.데이터 세트 열을 obsnames로 변환

최소한의 작업 예를 들어 내가 old_ds.Properties.VarNames를 실행하면 그 이미 표시입니다 (문자열로) 첫 번째 행이 이미 데이터 집합의 헤더입니다이

>> disp(old_ds) 

Date  firm1  firm2  firm3  firm4 
734692  880,0  102,1  32,7  204,2 
734695  880,0  102,0  30,9  196,4 
734696  880,0  100,0  30,9  200,2 
734697  880,0  101,4  30,9  200,2 
734698  880,0  100,8  30,9  202,2 

같다.
첫 번째 열을 ObsNames로 만드는 쉽고 빠른 방법이 있는지 궁금합니다.

첫 번째 방법으로 데이터 행렬 (예제에서는 2 ~ 5 열), 날짜 벡터를 "내 보낸다"는 생각을하고 행에 이름이있는 새 데이터 집합을 작성했습니다. 은 즉 : 마지막 줄은 다음과 같은 오류를 반환한다는 사실에서 별도로

>> mat = double(old_ds(:,2:5));   % taking the data, making it a matrix array 

>> head = old_ds.Properties.VarNames % saving headers 
>> head(1,1) = [];      % getting rid of 'Date' from head 

>> dates = dataset2cell(old_ds(:,1)); % taking dates as column cell array 
>> dates(1) = [];      % getting rid of 'Date' from dates 

>> new_ds = mat2dataset(mat,'VarNames',head,'ObsNames',dates); 

...

Error using setobsnames (line 25) 
NEWNAMES must be a nonempty string or a cell array of nonempty strings. 

Error in dataset (line 377) 
    a = setobsnames(a,obsnamesArg); 

Error in mat2dataset (line 75) 
    d = dataset(vars{:},args{:}); 

... 난 다음 함수를 만들어 해결책을 발견 한 것 (예를 내가 가지고있는 22 개의 데이터 집합 배열에 대해 프로세스를 일반화 한 다음 22 번 (각 데이터 집합 배열에 대해 한 번) 함수를 실행합니다. 데이터 집합을 원근감있게 보이게하려면 각 데이터 집합에 7660 개의 행과 2 ~ 1320의 열이 있어야합니다.

데이터 집합을 직접 "먹을"수있는 방법에 대해 알지 못합니다. 첫 번째 열은 ObsNames입니다.

누구든지 내게 힌트를 줄 수 있습니까?

편집 : 첨부 된 sample file.

+0

샘플 파일을 업로드 할 수 있습니까? – Cici

+0

@Cici, 샘플 파일에 링크 (마지막 줄)를 포함하도록 내 질문을 편집했습니다. 당신이 도울 수 있기를 바랍니다. 고맙습니다! – apsql

+0

파일을 열 수 없습니다 ... 저장할 때 -v7.3 태그를 추가해보십시오. – Cici

답변

0

거의 다 왔으므로 오류 메시지는 기본적으로 Obsname이 문자열이어야한다는 것입니다. 귀하의 경우 'dates'변수는 double을 포함하는 셀 배열입니다. 따라서 문자열로 변환하면됩니다. 사실

mat = double(piHU(:,2:end));   % taking the data, making it a matrix array 
head = piHU.Properties.VarNames % saving headers 
head(1) = [];      % getting rid of 'Date' from head 

dates = dataset2cell(piHU(:,1)); % taking dates as column cell array, here dates are of type double. try typing on the command window class(dates{2}), you can see the output is double. 
dates(1) = []; % getting rid of 'Date' from dates 
dates_str=cellfun(@(s) num2str(s),dates,'UniformOutput',false); % convert dates to string, now try typing class(dates_str{2}), the output should be char 

new_ds = mat2dataset(mat,'VarNames',head,'ObsNames',dates_str); % construct new dataset. 
+0

@Cici, 고맙지 만 내 질문이 명확하지 않다하더라도 (내 잘못), 실제로는 _ 동일한 방법 (기능처럼)을 얻는 더 쉽거나 빠른 (또는 둘 다) 방법이 있는지 물어보고 싶었습니다. 의심의 여지는, 내 지식으로는, 데이터를 가져 오기위한 GUI (예 : csv)가 ObsNames (R2013a 실행)를 설정할 수 없으며 읽기/저장 /로드 명령에 익숙해야한다는 사실 때문입니다. – apsql

+0

BTW, 내가 충분히 평판을 득점하면 대답을 upvote 것입니다 :) – apsql

+0

Obsname strings.http : // www의 세포 배열로 변환 후 set ('Obsname', Obsname)을 사용할 수 있습니다. mathworks.com/help/stats/dataset.set.html – Cici

1

그것은 아주 쉽게해야합니다 (하지만 난 당신의 질문을 읽고 있어요 사실이 같은 문제가, 내가 먼저 문서를 찾는 전에 봤 것을 의미한다 ...;)

데이터 세트를로드하려면 다음 명령을 사용하십시오 (물론 귀하의 경우에 맞게 조정하십시오).

cell_dat{1} = dataset('File', 'YourDataFile.csv', 'Delimiter', ';',... 
    'ReadObsNames', true); 

'ReadObsNames'기본값은 false입니다. 첫 번째 열의 머리글을 가져 와서 A.Properties.DimNames의 첫 번째 차원 이름으로 파일 또는 범위에 저장합니다. (Documentation 섹션 : "텍스트 파일 또는 Excel 스프레드 시트를 입력으로 사용할 때 사용할 수있는 이름/값 쌍"참조)

샘플 파일을 다운로드 할 수 없지만 문제가 아직 해결되지 않은 경우, 제안 된 솔루션을 시도해보고 작동하는지 확인하십시오. 도움이된다면 다행입니다.

관련 문제