我有一个不平衡的城市年度数据面板。在用NaNs填充缺失的值之后,我将数据作为列导入到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
和
22 11 34
22 10.5 34
10 34
你可以看到,由于2002年纽约市和2003年纽约市的人口缺失,我们也删除了这两年纽约市的面积数据。以这种方式删除缺失的条目后,nyc只剩下2行数据,而波士顿和芝加哥有3行数据。所以最终的数据不能存储在矩阵中。。。
编辑
另一种方法是,首先从主矩阵中删除缺失的值:
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乘3。。。
在回答之前,我应该说@cris-lunego注释是一个更好的主意,我还建议处理NaN
s,而不是使用单元数组。
然而,有一种方法是:
data = readtable('pathtodata');
cleanedData = data(~any(isnan(data{:, {'population', 'area'}}), 2), :);
[uniqueCities, ~, cityId] = unique(cleanedData.city, 'stable');
cPopulation = arrayfun(@(x) cleanedData.population(cityId == x), 1:length(uniqueCities), 'uni', 0);
cArea = arrayfun(@(x) cleanedData.area(cityId == x), 1:length(uniqueCities), 'uni', 0);
在这里,我们首先创建一个新的数据副本,如果population
或area
是NaN
,则该副本将删除行。
接下来,我们使用unique
函数的第三个输出来创建一个矢量,用于标识表中唯一城市的位置。
最后,使用arrayfun
函数,我们提取所需的数据,通过传递名称值对uni
和false
指定输出应该是一个单元数组