我有一個city-year級數據的不平衡面板。在用nan填充缺失的值之后,我將數據作為列導入matlab。例如:
city year population area
nyc 2000 140 22
nyc 2001 151 22
nyc 2002 NaN 22.5
nyc 2003 NaN 22.5
boston 2000 NaN 10
boston 2001 75 11
boston 2002 76 10.5
boston 2003 77 10
chicago 2000 43 34
chicago 2001 42 31
chicago 2002 43 NaN
chicago 2003 45 34
我可以把每一列重塑成一個矩陣,其中一列代表一個城市。例如:mPopulation = reshape(population,[4,3])
給出
140 NaN 43
151 75 42
NaN 76 43
NaN 77 45
類似地,mArea = reshape(area,[4,3])
給出
22 10 34
22 11 34
22.5 10.5 NaN
22.5 10 34
注意,(1)mPopulation
和mArea
在不同的位置有NaN
(2) 在一個矩陣中,不同的城市有不同數量的缺失值。
以后的分析無法對丟失的值執行,因此我認為需要將每一列重新格式化為一個單元格,因為它允許具有不同行數的列。
因此,問題是(1)如何將矩陣轉化為單元(2) 如何在不同的單元格中刪除同一城市的缺失值,使每個單元格在同一城市中具有相同的行數?
我們想要得到的最終結果是兩個單元格cPopulation
和cArea
:
140 75 43
151 76 42
77 45
and
22 11 34
22 10.5 34
10 34
您可以看到,由于nyc-2002和nyc-2003的人口缺失,我們還刪除了這兩年紐約市的面積數據。以這種方式刪除丟失的條目后,紐約只剩下2行數據,而波士頓和芝加哥只有3行數據。所以最終的數據不能存儲在矩陣中。。。
EDIT
另一種方法是,首先從主矩陣中刪除缺少的值:
city year population area
nyc 2000 140 22
nyc 2001 151 22
boston 2001 75 11
boston 2002 76 10.5
boston 2003 77 10
chicago 2000 43 34
chicago 2001 42 31
chicago 2003 45 34
但是,很難將每一列轉換為一個單元格。由于不同的城市已經有不同的行數,我們不能使用reshape
命令,也就是說,不能告訴matlab每個城市的行數是4-by-3。。。
在回答之前,我應該說@cris-luengo注釋是一個更好的主意,我還建議處理
NaN
,而不是使用單元格數組。然而,一種方法是:
在這里,我們首先創建一個新的數據副本,如果
population
或area
是NaN
,則刪除其中的行。接下來,我們使用
unique
函數的第三個輸出來創建一個向量,標識表中唯一城市的位置。最后,使用
arrayfun
函數提取所需的數據,通過傳遞name-value對uni
和false
指定輸出應該是一個單元格數組