将多列重塑为单元格



我有一个不平衡的城市年度数据面板。在用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(mPopulationmArea在不同位置具有NaN。(2( 在一个矩阵中,不同的城市有不同数量的缺失值。

稍后的分析无法对缺失的值执行,所以我认为我需要将每一列重塑为一个单元格,因为它允许具有不同行数的列。

因此,问题是(1(如何将矩阵转换为单元格?(2( 如何在不同的单元格中删除同一城市的缺失值,使每个单元格对同一城市具有相同的行数?

我们想要得到的最终结果是两个细胞cPopulationcArea:

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注释是一个更好的主意,我还建议处理NaNs,而不是使用单元数组。

然而,有一种方法是:

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);

在这里,我们首先创建一个新的数据副本,如果populationareaNaN,则该副本将删除行。

接下来,我们使用unique函数的第三个输出来创建一个矢量,用于标识表中唯一城市的位置。

最后,使用arrayfun函数,我们提取所需的数据,通过传递名称值对unifalse指定输出应该是一个单元数组

相关内容

  • 没有找到相关文章

最新更新