2017-07-31 70 views
1

我有用戶評價項目的下列CSV格式:Matlab的:加載用戶項,等級CSV到等級矩陣

A1YS,8F20,3.0 
A3TS,8320,2.0 
A3BU,1905,5.0 
A3BU,3574,4.0 
A14X,185A,1.0 

的列是用戶名,項ID,等級

我想加載它與行對於用戶來說,列項和單元格值將包含收視率Matlab的矩陣(未知評級等於零)例如:

 8F20, 1905, 3574, 185A 
A1YS 3 , 0 , 0 , 0 
A3TS 2 , 0 , 0 , 0 
A3BU 0 , 5 , 4 , 0 
A14X 0 , 0 , 0 , 1 

另一件事,其實矩陣可以形成爲:

3 , 0 , 0 , 0 
2 , 0 , 0 , 0 
0 , 5 , 4 , 0 
0 , 0 , 0 , 1 

我是很新的Matlab和嘗試的一些變化:沒有大的成功

https://stackoverflow.com/a/13775907/1726419https://stackoverflow.com/a/19613301/1726419

- 我會的任何援助非常感謝。

編輯: 我有什麼至今:

fid = fopen('ratings_sample.csv'); 
out = textscan(fid,'%s%s%d%d','delimiter',','); 
fclose(fid); 

c1 = out{1}; 
c2 = out{2}; 
c3 = out{3}; 

我的問題是,我需要刪除重複的兩個c1 & c2,並填寫正確的矩陣內的細胞。另外,我不知道這是否是加載它的正確方法。

+0

你需要首先加載數據,然後操縱到你想要的形狀。你有沒有像第二個例子那樣嘗試textscan?如果是這樣,告訴我們你有多遠,什麼不工作? – Justin

+0

謝謝,@賈斯汀,我已經上傳了迄今爲止我所做的主要問題是旋轉矢量,重複刪除和填充數據...... – yossico

回答

2

如果用戶名和項目ID都是唯一的,你可以使用crosstab

UserID = categorical(c1); 
ItemID = categorical(c2); 
Rating = crosstab(UserID,ItemID); 
Rating(Rating==1) = c3; 

,並得到:

Rating = 
    3  0  0  0  0 
    0  0  0  0  1 
    0  2  5  0  0 
    0  0  0  4  0 

如果你想將其安排在一個表,你需要先轉換項目的ID到有效變量名稱(以字母開頭):

Items = cellfun(@(s) ['Item_' s],c2,'un',0); 

and th恩,你可以使用一個table保存所有數據:

Tbl = array2table(Rating,... 
        'RowNames',unique(c1,'stable'),... 
        'VariableNames',unique(Items,'stable')) 

結果:

Tbl = 
    4×5 table 
      Item_8F20 Item_8320 Item_1905 Item_3574 Item_185A 
      _________ _________ _________ _________ _________ 
    A1YS 3   0   0   0   0   
    A3TS 0   0   0   0   1   
    A3BU 0   2   5   0   0   
    A14X 0   0   0   4   0