В этом примере показано, как к достоверным данным сохранен в таблице MATLAB®. Это также показывает, как выполнить вычисления при помощи числовых и категориальных данных, которые содержит таблица.
Поскольку таблицы и расписания являются контейнерами, работающий с ними несколько отличается, чем работа с обычными числовыми массивами. Пример показывает, как использовать различные табличные режимы индексирования, как эти режимы отличаются, и преимущества и недостатки каждого режима для различных ситуаций. Это также показывает, как получить доступ и присвоить данные, применяет преобразование и функции summary, преобразует табличные переменные в различные типы данных и строит результаты.
Данные о Корпусе Эймса, используемые в этом примере, прибывают из данных о жилой недвижимости для города Эймса, Айова, в Соединенных Штатах. Можно загрузить исходные данные из XLS (Excel® Workbook) электронная таблица. Описание данных доступно как текстовый файл. (Используемый с разрешением владельца авторских прав. Свяжитесь с владельцем авторских прав, если вы хотите опубликовать или перераспределить эти данные. )
Лучший способ импортировать электронную таблицу в MATLAB состоит в том, чтобы использовать readtable
функция, или для данных, которые включают метки времени, readtimetable
функция. В то время как Данные о Корпусе Эймса включают месяц продаж и год для каждого дома, месяц и год хранятся в отдельных столбцах. В этом случае более просто использовать readtable
.
Считайте данные о корпусе. С readtable
можно считать данные непосредственно из URL. Храните все текстовые данные из электронной таблицы как строковые массивы в выходной таблице. Кроме того, когда readtable
заголовки столбцов чтений из файла, это использует их в качестве табличной переменной, называет и преобразовывает их в допустимые идентификаторы MATLAB. Чтобы сохранить настоящие имена, используйте 'VariableNamingRule'
аргумент значения имени.
housing = readtable("http://jse.amstat.org/v19n3/decock/AmesHousing.xls","TextType","string");
Warning: Column headers from the file were modified to make them valid MATLAB identifiers before creating variable names for the table. The original column headers are saved in the VariableDescriptions property. Set 'VariableNamingRule' to 'preserve' to use the original column headers as table variable names.
Отобразите housing
. Таблица имеет одну переменную для каждого из этих 82 столбцов в электронной таблице.
housing
housing=2930×82 table
Order PID MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape LandContour Utilities LotConfig LandSlope Neighborhood Condition1 Condition2 BldgType HouseStyle OverallQual OverallCond YearBuilt YearRemod_Add RoofStyle RoofMatl Exterior1st Exterior2nd MasVnrType MasVnrArea ExterQual ExterCond Foundation BsmtQual BsmtCond BsmtExposure BsmtFinType1 BsmtFinSF1 BsmtFinType2 BsmtFinSF2 BsmtUnfSF TotalBsmtSF Heating HeatingQC CentralAir Electrical x1stFlrSF x2ndFlrSF LowQualFinSF GrLivArea BsmtFullBath BsmtHalfBath FullBath HalfBath BedroomAbvGr KitchenAbvGr KitchenQual TotRmsAbvGrd Functional Fireplaces FireplaceQu GarageType GarageYrBlt GarageFinish GarageCars GarageArea GarageQual GarageCond PavedDrive WoodDeckSF OpenPorchSF EnclosedPorch x3SsnPorch ScreenPorch PoolArea PoolQC Fence MiscFeature MiscVal MoSold YrSold SaleType SaleCondition SalePrice
_____ ____________ __________ ________ ___________ _______ ______ _____ ________ ___________ _________ _________ _________ ____________ __________ __________ ________ __________ ___________ ___________ _________ _____________ _________ _________ ___________ ___________ __________ __________ _________ _________ __________ ________ ________ ____________ ____________ __________ ____________ __________ _________ ___________ _______ _________ __________ __________ _________ _________ ____________ _________ ____________ ____________ ________ ________ ____________ ____________ ___________ ____________ __________ __________ ___________ __________ ___________ ____________ __________ __________ __________ __________ __________ __________ ___________ _____________ __________ ___________ ________ ______ _______ ___________ _______ ______ ______ ________ _____________ _________
1 "0526301100" "020" "RL" 141 31770 "Pave" "NA" "IR1" "Lvl" "AllPub" "Corner" "Gtl" "NAmes" "Norm" "Norm" "1Fam" "1Story" 6 5 1960 1960 "Hip" "CompShg" "BrkFace" "Plywood" "Stone" 112 "TA" "TA" "CBlock" "TA" "Gd" "Gd" "BLQ" 639 "Unf" 0 441 1080 "GasA" "Fa" "Y" "SBrkr" 1656 0 0 1656 1 0 1 0 3 1 "TA" 7 "Typ" 2 "Gd" "Attchd" 1960 "Fin" 2 528 "TA" "TA" "P" 210 62 0 0 0 0 "NA" "NA" "NA" 0 5 2010 "WD" "Normal" 2.15e+05
2 "0526350040" "020" "RH" 80 11622 "Pave" "NA" "Reg" "Lvl" "AllPub" "Inside" "Gtl" "NAmes" "Feedr" "Norm" "1Fam" "1Story" 5 6 1961 1961 "Gable" "CompShg" "VinylSd" "VinylSd" "None" 0 "TA" "TA" "CBlock" "TA" "TA" "No" "Rec" 468 "LwQ" 144 270 882 "GasA" "TA" "Y" "SBrkr" 896 0 0 896 0 0 1 0 2 1 "TA" 5 "Typ" 0 "NA" "Attchd" 1961 "Unf" 1 730 "TA" "TA" "Y" 140 0 0 0 120 0 "NA" "MnPrv" "NA" 0 6 2010 "WD" "Normal" 1.05e+05
3 "0526351010" "020" "RL" 81 14267 "Pave" "NA" "IR1" "Lvl" "AllPub" "Corner" "Gtl" "NAmes" "Norm" "Norm" "1Fam" "1Story" 6 6 1958 1958 "Hip" "CompShg" "Wd Sdng" "Wd Sdng" "BrkFace" 108 "TA" "TA" "CBlock" "TA" "TA" "No" "ALQ" 923 "Unf" 0 406 1329 "GasA" "TA" "Y" "SBrkr" 1329 0 0 1329 0 0 1 1 3 1 "Gd" 6 "Typ" 0 "NA" "Attchd" 1958 "Unf" 1 312 "TA" "TA" "Y" 393 36 0 0 0 0 "NA" "NA" "Gar2" 12500 6 2010 "WD" "Normal" 1.72e+05
4 "0526353030" "020" "RL" 93 11160 "Pave" "NA" "Reg" "Lvl" "AllPub" "Corner" "Gtl" "NAmes" "Norm" "Norm" "1Fam" "1Story" 7 5 1968 1968 "Hip" "CompShg" "BrkFace" "BrkFace" "None" 0 "Gd" "TA" "CBlock" "TA" "TA" "No" "ALQ" 1065 "Unf" 0 1045 2110 "GasA" "Ex" "Y" "SBrkr" 2110 0 0 2110 1 0 2 1 3 1 "Ex" 8 "Typ" 2 "TA" "Attchd" 1968 "Fin" 2 522 "TA" "TA" "Y" 0 0 0 0 0 0 "NA" "NA" "NA" 0 4 2010 "WD" "Normal" 2.44e+05
5 "0527105010" "060" "RL" 74 13830 "Pave" "NA" "IR1" "Lvl" "AllPub" "Inside" "Gtl" "Gilbert" "Norm" "Norm" "1Fam" "2Story" 5 5 1997 1998 "Gable" "CompShg" "VinylSd" "VinylSd" "None" 0 "TA" "TA" "PConc" "Gd" "TA" "No" "GLQ" 791 "Unf" 0 137 928 "GasA" "Gd" "Y" "SBrkr" 928 701 0 1629 0 0 2 1 3 1 "TA" 6 "Typ" 1 "TA" "Attchd" 1997 "Fin" 2 482 "TA" "TA" "Y" 212 34 0 0 0 0 "NA" "MnPrv" "NA" 0 3 2010 "WD" "Normal" 1.899e+05
6 "0527105030" "060" "RL" 78 9978 "Pave" "NA" "IR1" "Lvl" "AllPub" "Inside" "Gtl" "Gilbert" "Norm" "Norm" "1Fam" "2Story" 6 6 1998 1998 "Gable" "CompShg" "VinylSd" "VinylSd" "BrkFace" 20 "TA" "TA" "PConc" "TA" "TA" "No" "GLQ" 602 "Unf" 0 324 926 "GasA" "Ex" "Y" "SBrkr" 926 678 0 1604 0 0 2 1 3 1 "Gd" 7 "Typ" 1 "Gd" "Attchd" 1998 "Fin" 2 470 "TA" "TA" "Y" 360 36 0 0 0 0 "NA" "NA" "NA" 0 6 2010 "WD" "Normal" 1.955e+05
7 "0527127150" "120" "RL" 41 4920 "Pave" "NA" "Reg" "Lvl" "AllPub" "Inside" "Gtl" "StoneBr" "Norm" "Norm" "TwnhsE" "1Story" 8 5 2001 2001 "Gable" "CompShg" "CemntBd" "CmentBd" "None" 0 "Gd" "TA" "PConc" "Gd" "TA" "Mn" "GLQ" 616 "Unf" 0 722 1338 "GasA" "Ex" "Y" "SBrkr" 1338 0 0 1338 1 0 2 0 2 1 "Gd" 6 "Typ" 0 "NA" "Attchd" 2001 "Fin" 2 582 "TA" "TA" "Y" 0 0 170 0 0 0 "NA" "NA" "NA" 0 4 2010 "WD" "Normal" 2.135e+05
8 "0527145080" "120" "RL" 43 5005 "Pave" "NA" "IR1" "HLS" "AllPub" "Inside" "Gtl" "StoneBr" "Norm" "Norm" "TwnhsE" "1Story" 8 5 1992 1992 "Gable" "CompShg" "HdBoard" "HdBoard" "None" 0 "Gd" "TA" "PConc" "Gd" "TA" "No" "ALQ" 263 "Unf" 0 1017 1280 "GasA" "Ex" "Y" "SBrkr" 1280 0 0 1280 0 0 2 0 2 1 "Gd" 5 "Typ" 0 "NA" "Attchd" 1992 "RFn" 2 506 "TA" "TA" "Y" 0 82 0 0 144 0 "NA" "NA" "NA" 0 1 2010 "WD" "Normal" 1.915e+05
9 "0527146030" "120" "RL" 39 5389 "Pave" "NA" "IR1" "Lvl" "AllPub" "Inside" "Gtl" "StoneBr" "Norm" "Norm" "TwnhsE" "1Story" 8 5 1995 1996 "Gable" "CompShg" "CemntBd" "CmentBd" "None" 0 "Gd" "TA" "PConc" "Gd" "TA" "No" "GLQ" 1180 "Unf" 0 415 1595 "GasA" "Ex" "Y" "SBrkr" 1616 0 0 1616 1 0 2 0 2 1 "Gd" 5 "Typ" 1 "TA" "Attchd" 1995 "RFn" 2 608 "TA" "TA" "Y" 237 152 0 0 0 0 "NA" "NA" "NA" 0 3 2010 "WD" "Normal" 2.365e+05
10 "0527162130" "060" "RL" 60 7500 "Pave" "NA" "Reg" "Lvl" "AllPub" "Inside" "Gtl" "Gilbert" "Norm" "Norm" "1Fam" "2Story" 7 5 1999 1999 "Gable" "CompShg" "VinylSd" "VinylSd" "None" 0 "TA" "TA" "PConc" "TA" "TA" "No" "Unf" 0 "Unf" 0 994 994 "GasA" "Gd" "Y" "SBrkr" 1028 776 0 1804 0 0 2 1 3 1 "Gd" 7 "Typ" 1 "TA" "Attchd" 1999 "Fin" 2 442 "TA" "TA" "Y" 140 60 0 0 0 0 "NA" "NA" "NA" 0 6 2010 "WD" "Normal" 1.89e+05
11 "0527163010" "060" "RL" 75 10000 "Pave" "NA" "IR1" "Lvl" "AllPub" "Corner" "Gtl" "Gilbert" "Norm" "Norm" "1Fam" "2Story" 6 5 1993 1994 "Gable" "CompShg" "HdBoard" "HdBoard" "None" 0 "TA" "TA" "PConc" "Gd" "TA" "No" "Unf" 0 "Unf" 0 763 763 "GasA" "Gd" "Y" "SBrkr" 763 892 0 1655 0 0 2 1 3 1 "TA" 7 "Typ" 1 "TA" "Attchd" 1993 "Fin" 2 440 "TA" "TA" "Y" 157 84 0 0 0 0 "NA" "NA" "NA" 0 4 2010 "WD" "Normal" 1.759e+05
12 "0527165230" "020" "RL" NaN 7980 "Pave" "NA" "IR1" "Lvl" "AllPub" "Inside" "Gtl" "Gilbert" "Norm" "Norm" "1Fam" "1Story" 6 7 1992 2007 "Gable" "CompShg" "HdBoard" "HdBoard" "None" 0 "TA" "Gd" "PConc" "Gd" "TA" "No" "ALQ" 935 "Unf" 0 233 1168 "GasA" "Ex" "Y" "SBrkr" 1187 0 0 1187 1 0 2 0 3 1 "TA" 6 "Typ" 0 "NA" "Attchd" 1992 "Fin" 2 420 "TA" "TA" "Y" 483 21 0 0 0 0 "NA" "GdPrv" "Shed" 500 3 2010 "WD" "Normal" 1.85e+05
13 "0527166040" "060" "RL" 63 8402 "Pave" "NA" "IR1" "Lvl" "AllPub" "Inside" "Gtl" "Gilbert" "Norm" "Norm" "1Fam" "2Story" 6 5 1998 1998 "Gable" "CompShg" "VinylSd" "VinylSd" "None" 0 "TA" "TA" "PConc" "Gd" "TA" "No" "Unf" 0 "Unf" 0 789 789 "GasA" "Gd" "Y" "SBrkr" 789 676 0 1465 0 0 2 1 3 1 "TA" 7 "Typ" 1 "Gd" "Attchd" 1998 "Fin" 2 393 "TA" "TA" "Y" 0 75 0 0 0 0 "NA" "NA" "NA" 0 5 2010 "WD" "Normal" 1.804e+05
14 "0527180040" "020" "RL" 85 10176 "Pave" "NA" "Reg" "Lvl" "AllPub" "Inside" "Gtl" "Gilbert" "Norm" "Norm" "1Fam" "1Story" 7 5 1990 1990 "Gable" "CompShg" "HdBoard" "HdBoard" "None" 0 "TA" "TA" "PConc" "Gd" "TA" "Gd" "GLQ" 637 "Unf" 0 663 1300 "GasA" "Gd" "Y" "SBrkr" 1341 0 0 1341 1 0 1 1 2 1 "Gd" 5 "Typ" 1 "Po" "Attchd" 1990 "Unf" 2 506 "TA" "TA" "Y" 192 0 0 0 0 0 "NA" "NA" "NA" 0 2 2010 "WD" "Normal" 1.715e+05
15 "0527182190" "120" "RL" NaN 6820 "Pave" "NA" "IR1" "Lvl" "AllPub" "Corner" "Gtl" "StoneBr" "Norm" "Norm" "TwnhsE" "1Story" 8 5 1985 1985 "Gable" "CompShg" "HdBoard" "HdBoard" "None" 0 "Gd" "TA" "PConc" "Gd" "TA" "Av" "GLQ" 368 "BLQ" 1120 0 1488 "GasA" "TA" "Y" "SBrkr" 1502 0 0 1502 1 0 1 1 1 1 "Gd" 4 "Typ" 0 "NA" "Attchd" 1985 "RFn" 2 528 "TA" "TA" "Y" 0 54 0 0 140 0 "NA" "NA" "NA" 0 6 2010 "WD" "Normal" 2.12e+05
16 "0527216070" "060" "RL" 47 53504 "Pave" "NA" "IR2" "HLS" "AllPub" "CulDSac" "Mod" "StoneBr" "Norm" "Norm" "1Fam" "2Story" 8 5 2003 2003 "Hip" "CompShg" "CemntBd" "Wd Shng" "BrkFace" 603 "Ex" "TA" "PConc" "Gd" "TA" "Gd" "ALQ" 1416 "Unf" 0 234 1650 "GasA" "Ex" "Y" "SBrkr" 1690 1589 0 3279 1 0 3 1 4 1 "Ex" 12 "Mod" 1 "Gd" "BuiltIn" 2003 "Fin" 3 841 "TA" "TA" "Y" 503 36 0 0 210 0 "NA" "NA" "NA" 0 6 2010 "WD" "Normal" 5.38e+05
⋮
Электронная таблица имеет некоторые заголовки столбцов с пробелами и другие заголовки столбцов, которые запускаются с чисел. Заголовки столбцов становятся именами переменных в выходной таблице. По умолчанию, readtable
стандартизирует имена с пробелами при помощи Camel-регистра и стандартизирует имена, начинающиеся с чисел путем предварительного ожидания их с 'x'
. Несмотря на то, что таблица может иметь имена переменных с пробелами и другими неалфавитно-цифровыми символами в них, стандартизация делает работу с именами табличной переменной более естественной. Прежде, чем стандартизировать имена, readtable
сохраняет заголовки первоначального столбца в housing.Properties.VariableDescriptions
.
housing.Properties.VariableDescriptions
ans = 1×82 cell
{'Order'} {'PID'} {'MS SubClass'} {'MS Zoning'} {'Lot Frontage'} {'Lot Area'} {'Street'} {'Alley'} {'Lot Shape'} {'Land Contour'} {'Utilities'} {'Lot Config'} {'Land Slope'} {'Neighborhood'} {'Condition 1'} {'Condition 2'} {'Bldg Type'} {'House Style'} {'Overall Qual'} {'Overall Cond'} {'Year Built'} {'Year Remod/Add'} {'Roof Style'} {'Roof Matl'} {'Exterior 1st'} {'Exterior 2nd'} {'Mas Vnr Type'} {'Mas Vnr Area'} {'Exter Qual'} {'Exter Cond'} {'Foundation'} {'Bsmt Qual'} {'Bsmt Cond'} {'Bsmt Exposure'} {'BsmtFin Type 1'} {'BsmtFin SF 1'} {'BsmtFin Type 2'} {'BsmtFin SF 2'} {'Bsmt Unf SF'} {'Total Bsmt SF'} {'Heating'} {'Heating QC'} {'Central Air'} {'Electrical'} {'1st Flr SF'} {'2nd Flr SF'} {'Low Qual Fin SF'} {'Gr Liv Area'} {'Bsmt Full Bath'} {'Bsmt Half Bath'} {'Full Bath'} {'Half Bath'} {'Bedroom AbvGr'} {'Kitchen AbvGr'} {'Kitchen Qual'} {'TotRms AbvGrd'} {'Functional'} {'Fireplaces'} {'Fireplace Qu'} {'Garage Type'} {'Garage Yr Blt'} {'Garage Finish'} {'Garage Cars'} {'Garage Area'} {'Garage Qual'} {'Garage Cond'} {'Paved Drive'} {'Wood Deck SF'} {'Open Porch SF'} {'Enclosed Porch'} {'3Ssn Porch'} {'Screen Porch'} {'Pool Area'} {'Pool QC'} {'Fence'} {'Misc Feature'} {'Misc Val'} {'Mo Sold'} {'Yr Sold'} {'Sale Type'} {'Sale Condition'} {'SalePrice'}
В этом примере исходные имена переменных не нужны. Чтобы удалить их, присвойте массив пустой ячейки VariableDescriptions
свойство.
housing.Properties.VariableDescriptions = {};
Можно удалить Order
переменная, потому что это - индекс строки и не нужный. Чтобы удалить одну переменную из таблицы, присвойте пустой массив, []
, к переменной, так же, как вы удаляете строки или столбцы из матрицы.
housing.Order = [];
Существует 81 переменная, оставленная в таблице. Для полного анализа цен на жилье большинство переменных, вероятно, важно. Но для этого примера, необходимо только намного меньшее подмножество. Удалить нежелательные переменные один за другим утомительно. removevars
функция может удалить их целиком, но в этом случае существует более легкий путь. Сначала перечислите переменные, которые вы хотите сохранить. Затем используйте индексирование, чтобы выбрать их и удалить другие. Выбор переменных по наименованию часто намного легче, чем выяснение их числовых индексов.
keep = ["PID" "MSSubClass" "LotFrontage", "LotArea" "Neighborhood" "BldgType" ... "OverallCond" "YearBuilt" "YearRemod_Add" "Foundation" "Heating" ... "CentralAir" "x1stFlrSF" "x2ndFlrSF" "LowQualFinSF" "GrLivArea" ... "BsmtFullBath" "BsmtHalfBath" "FullBath" "HalfBath" "BedroomAbvGr" ... "GarageType" "MoSold" "YrSold" "SalePrice"]; housing = housing(:,keep)
housing=2930×25 table
PID MSSubClass LotFrontage LotArea Neighborhood BldgType OverallCond YearBuilt YearRemod_Add Foundation Heating CentralAir x1stFlrSF x2ndFlrSF LowQualFinSF GrLivArea BsmtFullBath BsmtHalfBath FullBath HalfBath BedroomAbvGr GarageType MoSold YrSold SalePrice
____________ __________ ___________ _______ ____________ ________ ___________ _________ _____________ __________ _______ __________ _________ _________ ____________ _________ ____________ ____________ ________ ________ ____________ __________ ______ ______ _________
"0526301100" "020" 141 31770 "NAmes" "1Fam" 5 1960 1960 "CBlock" "GasA" "Y" 1656 0 0 1656 1 0 1 0 3 "Attchd" 5 2010 2.15e+05
"0526350040" "020" 80 11622 "NAmes" "1Fam" 6 1961 1961 "CBlock" "GasA" "Y" 896 0 0 896 0 0 1 0 2 "Attchd" 6 2010 1.05e+05
"0526351010" "020" 81 14267 "NAmes" "1Fam" 6 1958 1958 "CBlock" "GasA" "Y" 1329 0 0 1329 0 0 1 1 3 "Attchd" 6 2010 1.72e+05
"0526353030" "020" 93 11160 "NAmes" "1Fam" 5 1968 1968 "CBlock" "GasA" "Y" 2110 0 0 2110 1 0 2 1 3 "Attchd" 4 2010 2.44e+05
"0527105010" "060" 74 13830 "Gilbert" "1Fam" 5 1997 1998 "PConc" "GasA" "Y" 928 701 0 1629 0 0 2 1 3 "Attchd" 3 2010 1.899e+05
"0527105030" "060" 78 9978 "Gilbert" "1Fam" 6 1998 1998 "PConc" "GasA" "Y" 926 678 0 1604 0 0 2 1 3 "Attchd" 6 2010 1.955e+05
"0527127150" "120" 41 4920 "StoneBr" "TwnhsE" 5 2001 2001 "PConc" "GasA" "Y" 1338 0 0 1338 1 0 2 0 2 "Attchd" 4 2010 2.135e+05
"0527145080" "120" 43 5005 "StoneBr" "TwnhsE" 5 1992 1992 "PConc" "GasA" "Y" 1280 0 0 1280 0 0 2 0 2 "Attchd" 1 2010 1.915e+05
"0527146030" "120" 39 5389 "StoneBr" "TwnhsE" 5 1995 1996 "PConc" "GasA" "Y" 1616 0 0 1616 1 0 2 0 2 "Attchd" 3 2010 2.365e+05
"0527162130" "060" 60 7500 "Gilbert" "1Fam" 5 1999 1999 "PConc" "GasA" "Y" 1028 776 0 1804 0 0 2 1 3 "Attchd" 6 2010 1.89e+05
"0527163010" "060" 75 10000 "Gilbert" "1Fam" 5 1993 1994 "PConc" "GasA" "Y" 763 892 0 1655 0 0 2 1 3 "Attchd" 4 2010 1.759e+05
"0527165230" "020" NaN 7980 "Gilbert" "1Fam" 7 1992 2007 "PConc" "GasA" "Y" 1187 0 0 1187 1 0 2 0 3 "Attchd" 3 2010 1.85e+05
"0527166040" "060" 63 8402 "Gilbert" "1Fam" 5 1998 1998 "PConc" "GasA" "Y" 789 676 0 1465 0 0 2 1 3 "Attchd" 5 2010 1.804e+05
"0527180040" "020" 85 10176 "Gilbert" "1Fam" 5 1990 1990 "PConc" "GasA" "Y" 1341 0 0 1341 1 0 1 1 2 "Attchd" 2 2010 1.715e+05
"0527182190" "120" NaN 6820 "StoneBr" "TwnhsE" 5 1985 1985 "PConc" "GasA" "Y" 1502 0 0 1502 1 0 1 1 1 "Attchd" 6 2010 2.12e+05
"0527216070" "060" 47 53504 "StoneBr" "1Fam" 5 2003 2003 "PConc" "GasA" "Y" 1690 1589 0 3279 1 0 3 1 4 "BuiltIn" 6 2010 5.38e+05
⋮
Два из имен переменных не очень ясны. Переименуйте те переменные с лучшими именами при помощи VariableNames
свойство.
housing.Properties.VariableNames(["GrLivArea" "LowQualFinSF"]) = ["TotalAboveGroundLivingArea" "LowQualFinishedArea"];
Существует два других имен переменных, начиная с 'x'
, тот нечетный взгляд. Другой способ переименовать их состоит в том, чтобы использовать renamevars
функция. Если вы используете renamevars
, присвойте выход исходной таблице. В противном случае обновление потеряно.
housing = renamevars(housing,["x1stFlrSF" "x2ndFlrSF"],["FirstFlrArea" "SecondFlrArea"]);
Шесть из переменных являются строковыми массивами. Концептуально они все содержат категориальные данные: дискретные, нечисловые значения, чертившие от маленького фиксированного набора возможных значений или категорий. Это - почти всегда хорошая идея преобразовать такие данные в categorical
массивы. Можно использовать detectImportOptions
функционируйте, чтобы управлять типами данных данных, которые вы считываете с readtable
. Но вместо того, чтобы запуститься, можно преобразовать эти табличные переменные, чтобы иметь categorical
тип данных. Например, преобразуйте Neighborhood
переменная к categorical
массив.
housing.Neighborhood = categorical(housing.Neighborhood);
Это присвоение перезаписи, или замены, переменная Neighborhood
существующего текста в таблице с новым
categorical
переменная. Замена - то, что позволяет присвоению изменить тип данных. В отличие от этого это присвоение, используя индексацию:
housing.Neighborhood(:) = categorical(housing.Neighborhood)
значения присвоений в переменную существующего текста, поэлементно, вместо замены переменной. В этом случае housing.Neighborhood
остается массив строк. Это поведение сопоставимо с поведением обычных переменных рабочей области. Присвоение путем индексации в массив не изменяет тип массива. Например, если вы индексируете в массив целых чисел и присваиваете значение с плавающей точкой элементу, значение является усеченным и сохранено как целое число.
x = uint32([1 2 3]);
x(2) = 2.2 % converted to 2, as a uint32
x = 1×3 uint32 row vector
1 2 3
Присвоение с записью через точку является одним способом преобразовать тип переменной в таблице. convertvars
функция иначе и обладает двумя преимуществами. Во-первых, это избегает любого беспорядка о перезаписи в противоположность присвоению в переменную. convertvars
функционируйте всегда перезаписывает существующие переменные и преобразует их тип. Во-вторых, convertvars
может работать больше чем с одной переменной за один раз. В housing
существует еще несколько текстовых переменных быть преобразованным в
categorical
тип данных. Изменение их по одному стало бы утомительным, но convertvars
может преобразовать больше чем одну переменную в одной команде.
housing = convertvars(housing,["BldgType" "Foundation"],"categorical");
Не необходимо явным образом перечислить переменные по наименованию или положение в таблице. Можно найти все табличные переменные, которые являются строковыми массивами и преобразуют их в categorical
переменные. Чтобы задать табличные переменные, которые являются строковыми массивами, используйте указатель на функцию @isstring
при вызове convertvars
.
housing = convertvars(housing,@isstring,"categorical");
В обоих случаях присвойте выход convertvars
назад к исходной таблице. В противном случае обновление потеряно.
Иногда, преобразовывая все текстовые переменные в categorical
слишком много. Например, если бы имена текущих домовладельцев присутствовали в данных, то они не были бы целесообразны хранить их в categorical
переменная. Имена домовладельцев не задают категории корпуса. Вы можете сохранить их имена в массиве строк вместо этого.
Как другой пример, CentralAir
переменная является одной из переменных, которая была преобразована в categorical
. Но потому что его категориями является только Y
и N
, может иметь больше смысла считать его logical
переменная.
summary(housing.CentralAir)
N 196 Y 2734
logical
тип данных (как все целочисленные типы) не позволяет отсутствующие значения (аналогичный NaN
), в то время как categorical
делает. CentralAir
переменная, оказывается, не имеет никаких недостающих значений данных. Можно использовать любой logical
или categorical
как тип данных для CentralAir
.
any(ismissing(housing.CentralAir))
ans = logical
0
Преобразуйте тип данных в logical
, с true
соответствие Y
, использование записи через точку, чтобы перезаписать существующий categorical
переменная с новым logical
один.
housing.CentralAir = (housing.CentralAir == "Y");
Отобразите конвертированные данные в housing
.
housing
housing=2930×25 table
PID MSSubClass LotFrontage LotArea Neighborhood BldgType OverallCond YearBuilt YearRemod_Add Foundation Heating CentralAir FirstFlrArea SecondFlrArea LowQualFinishedArea TotalAboveGroundLivingArea BsmtFullBath BsmtHalfBath FullBath HalfBath BedroomAbvGr GarageType MoSold YrSold SalePrice
__________ __________ ___________ _______ ____________ ________ ___________ _________ _____________ __________ _______ __________ ____________ _____________ ___________________ __________________________ ____________ ____________ ________ ________ ____________ __________ ______ ______ _________
0526301100 020 141 31770 NAmes 1Fam 5 1960 1960 CBlock GasA true 1656 0 0 1656 1 0 1 0 3 Attchd 5 2010 2.15e+05
0526350040 020 80 11622 NAmes 1Fam 6 1961 1961 CBlock GasA true 896 0 0 896 0 0 1 0 2 Attchd 6 2010 1.05e+05
0526351010 020 81 14267 NAmes 1Fam 6 1958 1958 CBlock GasA true 1329 0 0 1329 0 0 1 1 3 Attchd 6 2010 1.72e+05
0526353030 020 93 11160 NAmes 1Fam 5 1968 1968 CBlock GasA true 2110 0 0 2110 1 0 2 1 3 Attchd 4 2010 2.44e+05
0527105010 060 74 13830 Gilbert 1Fam 5 1997 1998 PConc GasA true 928 701 0 1629 0 0 2 1 3 Attchd 3 2010 1.899e+05
0527105030 060 78 9978 Gilbert 1Fam 6 1998 1998 PConc GasA true 926 678 0 1604 0 0 2 1 3 Attchd 6 2010 1.955e+05
0527127150 120 41 4920 StoneBr TwnhsE 5 2001 2001 PConc GasA true 1338 0 0 1338 1 0 2 0 2 Attchd 4 2010 2.135e+05
0527145080 120 43 5005 StoneBr TwnhsE 5 1992 1992 PConc GasA true 1280 0 0 1280 0 0 2 0 2 Attchd 1 2010 1.915e+05
0527146030 120 39 5389 StoneBr TwnhsE 5 1995 1996 PConc GasA true 1616 0 0 1616 1 0 2 0 2 Attchd 3 2010 2.365e+05
0527162130 060 60 7500 Gilbert 1Fam 5 1999 1999 PConc GasA true 1028 776 0 1804 0 0 2 1 3 Attchd 6 2010 1.89e+05
0527163010 060 75 10000 Gilbert 1Fam 5 1993 1994 PConc GasA true 763 892 0 1655 0 0 2 1 3 Attchd 4 2010 1.759e+05
0527165230 020 NaN 7980 Gilbert 1Fam 7 1992 2007 PConc GasA true 1187 0 0 1187 1 0 2 0 3 Attchd 3 2010 1.85e+05
0527166040 060 63 8402 Gilbert 1Fam 5 1998 1998 PConc GasA true 789 676 0 1465 0 0 2 1 3 Attchd 5 2010 1.804e+05
0527180040 020 85 10176 Gilbert 1Fam 5 1990 1990 PConc GasA true 1341 0 0 1341 1 0 1 1 2 Attchd 2 2010 1.715e+05
0527182190 120 NaN 6820 StoneBr TwnhsE 5 1985 1985 PConc GasA true 1502 0 0 1502 1 0 1 1 1 Attchd 6 2010 2.12e+05
0527216070 060 47 53504 StoneBr 1Fam 5 2003 2003 PConc GasA true 1690 1589 0 3279 1 0 3 1 4 BuiltIn 6 2010 5.38e+05
⋮
Все текстовые данные были преобразованы в categorical
переменные. Но существует все еще несколько вещей вымыться.
OverallCond
переменная была считана в как числовой массив, но его значения все чертятся от целых чисел 1
-10. Можно оставить эти значения как числовые данные, но можно думать о них как о порядковом
categorical
данные. Когда categorical
массив является порядковым, его категории имеют заданный порядок. Например, категории 10
и 5
может быть сравнен (10 > 5
, потому что дом, условие которого оценивается как 10
теоретически более хорошо, чем один расчетный 5
), но для этих сравнений, нет никакого числового значения к 10 - 5
. Постараться не непреднамеренно обрабатывать OverallCond
как числовые данные, преобразуйте его в порядковый categorical
массив, который все еще включает реляционные сравнения, но предотвращает арифметические операции. Названия категории 1
, 2, и так далее легки интерпретировать и приемлемы.
housing.OverallCond = categorical(housing.OverallCond,1:10,"Ordinal",true);
Точно так же MSSubClass
переменная состояла из цифровых кодов в исходной электронной таблице. Можно думать о тех значениях, как являющихся categorical
данные. Поскольку нет никакого математического порядка к этим конкретным кодам, категории являются непорядковыми (или номинал). В этом случае, readtable
считайте те значения в том, когда текст, чтобы сохранить продвижение обнуляет в кодах. MSSubClass
был затем преобразован в categorical
данные.
В то время как MSSubClass
имеет тип данных, который вы хотите, вы можете найти трудным интерпретировать коды как категории зданий. Файл, который описывает Данные о Корпусе Эймса, содержит определения цифровых кодов. При давании этим категориям читаемые имена могут помочь вам изучить данные. Чтобы прояснить, какие имена идут с который числа, задайте обоих категории (code
) и их имена (subclass
) в другом вызове categorical
функция.
code = ["020" "030" "040" "045" "050" "060" "070" "075" "080" "085" "090" "120" "150" "160" "180" "190"]; subclass = ["1-STORY 1946 & NEWER ALL STYLES" ... "1-STORY 1945 & OLDER" ... "1-STORY W/FINISHED ATTIC ALL AGES" ... "1-1/2 STORY - UNFINISHED ALL AGES" ... "1-1/2 STORY FINISHED ALL AGES" ... "2-STORY 1946 & NEWER" ... "2-STORY 1945 & OLDER" ... "2-1/2 STORY ALL AGES" ... "SPLIT OR MULTI-LEVEL" ... "SPLIT FOYER" ... "DUPLEX - ALL STYLES AND AGES" ... "1-STORY PUD (Planned Unit Development) - 1946 & NEWER" ... "1-1/2 STORY PUD - ALL AGES" ... "2-STORY PUD - 1946 & NEWER" ... "PUD - MULTILEVEL - INCL SPLIT LEV/FOYER" ... "2 FAMILY CONVERSION - ALL STYLES AND AGES"]; housing.MSSubClass = categorical(housing.MSSubClass,code,subclass);
Названия категории для BldgType
переменная не очевидна. Как с MSSubClass
, более описательные имена могут помочь вам изучить категории создания. Чтобы отобразить число домов в каждой категории создания, используйте summary
функция.
summary(housing.BldgType)
1Fam 2425 2fmCon 62 Duplex 109 Twnhs 101 TwnhsE 233
Только с пятью категориями можно безопасно перечислить новые названия категории в правильном порядке, не задавая старые названия. Чтобы переименовать категории, используйте renamecats
функция.
types = ["Single-family Detached" "Two-family Conversion" "Duplex" "Townhouse End Unit" "Townhouse Inside Unit"]; housing.BldgType = renamecats(housing.BldgType,types);
GarageType
переменная включает категорию NA
, положение за Не Применимый. В GarageType
N/A
средние значения, что дом не имеет гаража. Но слишком легко перепутать NA
с отсутствующим значением. Истинное отсутствующее значение означает, что нельзя определить, имеет ли дом гараж. Но в этих данных о корпусе, всегда известно, имеет ли дом гараж. Измените то одно название категории, чтобы сделать его значение более ясным.
housing.GarageType = renamecats(housing.GarageType,"NA","None");
Наконец, PID
переменная была считана в как массив строк. В то время как его значения были числовыми, у некоторых из них было продвижение, обнуляет. readtable
функция сохранила эту информацию путем хранения значений как строк. Затем вызов convertvars
преобразованный PID
переменная к categorical
массив. PID
идентификационные номера хранилищ, которые уникальны. Идентификационные номера присвоены по мере необходимости и не прибывают из фиксированного множества значений. Нет никакого конкретного преимущества в хранении их в categorical
переменная. Если каждый идентификационный номер является категорией, то добавление нового идентификационного номера означает добавлять новую категорию в PID
. Может быть более удобно преобразовать PID
назад к массиву строк. Чтобы преобразовать значения в строки, используйте string
функция.
housing.PID = string(housing.PID);
Отобразите результаты очистки предварительных данных.
housing
housing=2930×25 table
PID MSSubClass LotFrontage LotArea Neighborhood BldgType OverallCond YearBuilt YearRemod_Add Foundation Heating CentralAir FirstFlrArea SecondFlrArea LowQualFinishedArea TotalAboveGroundLivingArea BsmtFullBath BsmtHalfBath FullBath HalfBath BedroomAbvGr GarageType MoSold YrSold SalePrice
____________ _____________________________________________________ ___________ _______ ____________ ______________________ ___________ _________ _____________ __________ _______ __________ ____________ _____________ ___________________ __________________________ ____________ ____________ ________ ________ ____________ __________ ______ ______ _________
"0526301100" 1-STORY 1946 & NEWER ALL STYLES 141 31770 NAmes Single-family Detached 5 1960 1960 CBlock GasA true 1656 0 0 1656 1 0 1 0 3 Attchd 5 2010 2.15e+05
"0526350040" 1-STORY 1946 & NEWER ALL STYLES 80 11622 NAmes Single-family Detached 6 1961 1961 CBlock GasA true 896 0 0 896 0 0 1 0 2 Attchd 6 2010 1.05e+05
"0526351010" 1-STORY 1946 & NEWER ALL STYLES 81 14267 NAmes Single-family Detached 6 1958 1958 CBlock GasA true 1329 0 0 1329 0 0 1 1 3 Attchd 6 2010 1.72e+05
"0526353030" 1-STORY 1946 & NEWER ALL STYLES 93 11160 NAmes Single-family Detached 5 1968 1968 CBlock GasA true 2110 0 0 2110 1 0 2 1 3 Attchd 4 2010 2.44e+05
"0527105010" 2-STORY 1946 & NEWER 74 13830 Gilbert Single-family Detached 5 1997 1998 PConc GasA true 928 701 0 1629 0 0 2 1 3 Attchd 3 2010 1.899e+05
"0527105030" 2-STORY 1946 & NEWER 78 9978 Gilbert Single-family Detached 6 1998 1998 PConc GasA true 926 678 0 1604 0 0 2 1 3 Attchd 6 2010 1.955e+05
"0527127150" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 41 4920 StoneBr Townhouse Inside Unit 5 2001 2001 PConc GasA true 1338 0 0 1338 1 0 2 0 2 Attchd 4 2010 2.135e+05
"0527145080" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 43 5005 StoneBr Townhouse Inside Unit 5 1992 1992 PConc GasA true 1280 0 0 1280 0 0 2 0 2 Attchd 1 2010 1.915e+05
"0527146030" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 39 5389 StoneBr Townhouse Inside Unit 5 1995 1996 PConc GasA true 1616 0 0 1616 1 0 2 0 2 Attchd 3 2010 2.365e+05
"0527162130" 2-STORY 1946 & NEWER 60 7500 Gilbert Single-family Detached 5 1999 1999 PConc GasA true 1028 776 0 1804 0 0 2 1 3 Attchd 6 2010 1.89e+05
"0527163010" 2-STORY 1946 & NEWER 75 10000 Gilbert Single-family Detached 5 1993 1994 PConc GasA true 763 892 0 1655 0 0 2 1 3 Attchd 4 2010 1.759e+05
"0527165230" 1-STORY 1946 & NEWER ALL STYLES NaN 7980 Gilbert Single-family Detached 7 1992 2007 PConc GasA true 1187 0 0 1187 1 0 2 0 3 Attchd 3 2010 1.85e+05
"0527166040" 2-STORY 1946 & NEWER 63 8402 Gilbert Single-family Detached 5 1998 1998 PConc GasA true 789 676 0 1465 0 0 2 1 3 Attchd 5 2010 1.804e+05
"0527180040" 1-STORY 1946 & NEWER ALL STYLES 85 10176 Gilbert Single-family Detached 5 1990 1990 PConc GasA true 1341 0 0 1341 1 0 1 1 2 Attchd 2 2010 1.715e+05
"0527182190" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER NaN 6820 StoneBr Townhouse Inside Unit 5 1985 1985 PConc GasA true 1502 0 0 1502 1 0 1 1 1 Attchd 6 2010 2.12e+05
"0527216070" 2-STORY 1946 & NEWER 47 53504 StoneBr Single-family Detached 5 2003 2003 PConc GasA true 1690 1589 0 3279 1 0 3 1 4 BuiltIn 6 2010 5.38e+05
⋮
Таблица имеет отдельные переменные в течение месяца и года продажи. Более удобно, если те переменные объединены в одном datetime
переменная. Присвоение при помощи записи через точку является хорошим способом добавить новую переменную на правом краю таблицы. Добавьте дату продажи как новая переменная.
housing.LastSoldDate = datetime(housing.YrSold,housing.MoSold,0,"Format","MMM yyyy");
Теперь удалите две исходных переменные. Легче перечислить переменные по наименованию и использовать removevars
.
housing = removevars(housing,["YrSold" "MoSold"])
housing=2930×24 table
PID MSSubClass LotFrontage LotArea Neighborhood BldgType OverallCond YearBuilt YearRemod_Add Foundation Heating CentralAir FirstFlrArea SecondFlrArea LowQualFinishedArea TotalAboveGroundLivingArea BsmtFullBath BsmtHalfBath FullBath HalfBath BedroomAbvGr GarageType SalePrice LastSoldDate
____________ _____________________________________________________ ___________ _______ ____________ ______________________ ___________ _________ _____________ __________ _______ __________ ____________ _____________ ___________________ __________________________ ____________ ____________ ________ ________ ____________ __________ _________ ____________
"0526301100" 1-STORY 1946 & NEWER ALL STYLES 141 31770 NAmes Single-family Detached 5 1960 1960 CBlock GasA true 1656 0 0 1656 1 0 1 0 3 Attchd 2.15e+05 Apr 2010
"0526350040" 1-STORY 1946 & NEWER ALL STYLES 80 11622 NAmes Single-family Detached 6 1961 1961 CBlock GasA true 896 0 0 896 0 0 1 0 2 Attchd 1.05e+05 May 2010
"0526351010" 1-STORY 1946 & NEWER ALL STYLES 81 14267 NAmes Single-family Detached 6 1958 1958 CBlock GasA true 1329 0 0 1329 0 0 1 1 3 Attchd 1.72e+05 May 2010
"0526353030" 1-STORY 1946 & NEWER ALL STYLES 93 11160 NAmes Single-family Detached 5 1968 1968 CBlock GasA true 2110 0 0 2110 1 0 2 1 3 Attchd 2.44e+05 Mar 2010
"0527105010" 2-STORY 1946 & NEWER 74 13830 Gilbert Single-family Detached 5 1997 1998 PConc GasA true 928 701 0 1629 0 0 2 1 3 Attchd 1.899e+05 Feb 2010
"0527105030" 2-STORY 1946 & NEWER 78 9978 Gilbert Single-family Detached 6 1998 1998 PConc GasA true 926 678 0 1604 0 0 2 1 3 Attchd 1.955e+05 May 2010
"0527127150" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 41 4920 StoneBr Townhouse Inside Unit 5 2001 2001 PConc GasA true 1338 0 0 1338 1 0 2 0 2 Attchd 2.135e+05 Mar 2010
"0527145080" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 43 5005 StoneBr Townhouse Inside Unit 5 1992 1992 PConc GasA true 1280 0 0 1280 0 0 2 0 2 Attchd 1.915e+05 Dec 2009
"0527146030" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 39 5389 StoneBr Townhouse Inside Unit 5 1995 1996 PConc GasA true 1616 0 0 1616 1 0 2 0 2 Attchd 2.365e+05 Feb 2010
"0527162130" 2-STORY 1946 & NEWER 60 7500 Gilbert Single-family Detached 5 1999 1999 PConc GasA true 1028 776 0 1804 0 0 2 1 3 Attchd 1.89e+05 May 2010
"0527163010" 2-STORY 1946 & NEWER 75 10000 Gilbert Single-family Detached 5 1993 1994 PConc GasA true 763 892 0 1655 0 0 2 1 3 Attchd 1.759e+05 Mar 2010
"0527165230" 1-STORY 1946 & NEWER ALL STYLES NaN 7980 Gilbert Single-family Detached 7 1992 2007 PConc GasA true 1187 0 0 1187 1 0 2 0 3 Attchd 1.85e+05 Feb 2010
"0527166040" 2-STORY 1946 & NEWER 63 8402 Gilbert Single-family Detached 5 1998 1998 PConc GasA true 789 676 0 1465 0 0 2 1 3 Attchd 1.804e+05 Apr 2010
"0527180040" 1-STORY 1946 & NEWER ALL STYLES 85 10176 Gilbert Single-family Detached 5 1990 1990 PConc GasA true 1341 0 0 1341 1 0 1 1 2 Attchd 1.715e+05 Jan 2010
"0527182190" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER NaN 6820 StoneBr Townhouse Inside Unit 5 1985 1985 PConc GasA true 1502 0 0 1502 1 0 1 1 1 Attchd 2.12e+05 May 2010
"0527216070" 2-STORY 1946 & NEWER 47 53504 StoneBr Single-family Detached 5 2003 2003 PConc GasA true 1690 1589 0 3279 1 0 3 1 4 BuiltIn 5.38e+05 May 2010
⋮
Исследуйте данные путем создания некоторых простых графиков. Много основных команд графического вывода не принимают таблицы как входные параметры. Но можно использовать запись через точку, чтобы передать одну или несколько табличных переменных в функцию построения графика. Вы вынимаете массивы из таблицы и передаете их как входные параметры к функции построения графика.
Например, сделайте график рассеивания отпускных цен зданий в таблице в зависимости от лет, в которых они были созданы.
scatter(housing.YearBuilt,housing.SalePrice,20,"filled");
Логарифмическое преобразование цен может показать более простое отношение между годом и ценой. Кроме того, можно показать больше информации в графике рассеивания при помощи жилой зоны зданий, чтобы окрасить маркеры. Жилые зоны имеют длинный правый хвост, таким образом, также полезно показать логарифмическое преобразование областей. Чтобы преобразовать эти две табличных переменные, перенесите их в вызовы log
функция. Затем сделайте другой график рассеивания.
logSalePrice = log(housing.SalePrice);
logLivingArea = log(housing.TotalAboveGroundLivingArea);
scatter(housing.YearBuilt,logSalePrice,20,logLivingArea,"filled");
Любой большой набор комплексных данных, собранный за длительный период времени, может содержать некоторые ошибки. Проверьте ошибки в данных о корпусе. Даты в данных являются хорошим местом, чтобы запуститься. Сначала сравните YearBuilt
к YearRemod_Add
.
checkRows = housing.YearBuilt > housing.YearRemod_Add; housing(checkRows,:)
ans=1×24 table
PID MSSubClass LotFrontage LotArea Neighborhood BldgType OverallCond YearBuilt YearRemod_Add Foundation Heating CentralAir FirstFlrArea SecondFlrArea LowQualFinishedArea TotalAboveGroundLivingArea BsmtFullBath BsmtHalfBath FullBath HalfBath BedroomAbvGr GarageType SalePrice LastSoldDate
____________ _______________________________ ___________ _______ ____________ ______________________ ___________ _________ _____________ __________ _______ __________ ____________ _____________ ___________________ __________________________ ____________ ____________ ________ ________ ____________ __________ _________ ____________
"0907194160" 1-STORY 1946 & NEWER ALL STYLES 65 10739 CollgCr Single-family Detached 5 2002 2001 PConc GasA true 1444 0 0 1444 1 0 2 0 3 Attchd 2.03e+05 Mar 2009
Для модернизации не возможно быть сделанным в 2 001, если сам дом был создан в 2 002. Если вы принимаете что YearBuilt
значение, как известно, является ошибкой (предположение, которое должно быть подтверждено), можно использовать запись через точку, чтобы присвоить 2001 как год, в котором был создан этот дом.
housing.YearBuilt(checkRows) = 2001;
Как другая проверка, сравните новый LastSoldDate
переменная к YearBuilt
.
checkRows = housing.YearBuilt > year(housing.LastSoldDate); housing(checkRows,:)
ans=2×24 table
PID MSSubClass LotFrontage LotArea Neighborhood BldgType OverallCond YearBuilt YearRemod_Add Foundation Heating CentralAir FirstFlrArea SecondFlrArea LowQualFinishedArea TotalAboveGroundLivingArea BsmtFullBath BsmtHalfBath FullBath HalfBath BedroomAbvGr GarageType SalePrice LastSoldDate
____________ _______________________________ ___________ _______ ____________ ______________________ ___________ _________ _____________ __________ _______ __________ ____________ _____________ ___________________ __________________________ ____________ ____________ ________ ________ ____________ __________ __________ ____________
"0908154235" 2-STORY 1946 & NEWER 313 63887 Edwards Single-family Detached 5 2008 2008 PConc GasA true 4692 950 0 5642 2 0 2 1 3 Attchd 1.6e+05 Dec 2007
"0908154195" 1-STORY 1946 & NEWER ALL STYLES 128 39290 Edwards Single-family Detached 5 2008 2009 PConc GasA true 5095 0 0 5095 1 1 2 1 2 Attchd 1.8385e+05 Sep 2007
Существует другая проблема. Эти два здания были проданы в последних 2007, как показано в LastSoldDate
переменная. Но соответствующее значение в YearBuilt
2008. Может случиться так что для этих зданий, годы в YearBuilt
были зарегистрированы в ранних 2008 (другое подтверждение необходимости предположения). Обновите YearBuilt
переменная, на этот раз при помощи записи через точку, чтобы присвоить двум строкам.
housing.YearBuilt(checkRows) = 2007;
Следующий шаг в очистке данных должен проверять на недостающие данные в числовом и categorical
переменные. Тот logical
переменная в housing
не поддерживает отсутствующие значения. ismissing
функция указывает, какие элементы таблицы имеют отсутствующие значения.
missingElements = ismissing(housing)
missingElements = 2930×24 logical array
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
⋮
ismissing
функция возвращает logical
матрица, которая одного размера с таблицей. Подведение итогов столбцов той матрицы дает количество отсутствующих значений в каждой из переменных таблицы.
numMissing = sum(missingElements,1)
numMissing = 1×24
0 0 490 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0
Только три из переменных имеют недостающие данные, но без имен переменных не легко сказать, какие переменные они. Один способ сказать состоит в том, чтобы индексировать в VariableNames
свойство таблицы найти имена, которые соответствуют переменным с отсутствующими значениями.
housing.Properties.VariableNames(numMissing > 0)
ans = 1×3 cell
{'LotFrontage'} {'BsmtFullBath'} {'BsmtHalfBath'}
Решение, что сделать о недостающих данных, является проблемой. Если данные отсутствуют наугад, и существует только несколько отсутствующих значений, одна стратегия состоит в том, чтобы удалить те строки из таблицы. Четыре недостающих подвальных значения ванны (NaN
s, в этом случае), происходят только в двух строках. Можно удалить те две строки при помощи rmmissing
функция.
missingBsmtBath = ismissing(housing.BsmtFullBath) | ismissing(housing.BsmtHalfBath); housing(missingBsmtBath,:)
ans=2×24 table
PID MSSubClass LotFrontage LotArea Neighborhood BldgType OverallCond YearBuilt YearRemod_Add Foundation Heating CentralAir FirstFlrArea SecondFlrArea LowQualFinishedArea TotalAboveGroundLivingArea BsmtFullBath BsmtHalfBath FullBath HalfBath BedroomAbvGr GarageType SalePrice LastSoldDate
____________ _______________________________ ___________ _______ ____________ ______________________ ___________ _________ _____________ __________ _______ __________ ____________ _____________ ___________________ __________________________ ____________ ____________ ________ ________ ____________ __________ _________ ____________
"0903230120" 1-STORY 1946 & NEWER ALL STYLES 99 5940 BrkSide Single-family Detached 7 1946 1950 PConc GasA true 896 0 0 896 NaN NaN 1 0 2 Detchd 79000 Mar 2008
"0908154080" 1-STORY 1946 & NEWER ALL STYLES 123 47007 Edwards Single-family Detached 7 1959 1996 Slab GasA true 3820 0 0 3820 NaN NaN 3 1 5 Attchd 2.847e+05 Jun 2008
housing = rmmissing(housing,"DataVariables",["BsmtFullBath" "BsmtHalfBath"]); whos housing
Name Size Bytes Class Attributes housing 2928x24 595935 table
Этот вызов rmmissing
удаляет только строки, которые имеют отсутствующие значения в BsmtFullBath
и BsmtHalfBath
. Эти 490 строк с пропавшими без вести LotFrontage
значения находятся все еще в таблице. Можно удалить эти 490 строк, но выполнение так удаляет больше чем 16% данных. Также можно заполнить эти отсутствующие значения средним значением фасада при помощи fillmissing
функция, но это не практично для этих данных. Для переменных, которые формируют временные ряды, fillmissing
также переменные заполнения поддержек с интерполированными значениями или движущимся окном сглаживали значения. LotFrontage
не временные ряды. Данные в этой переменной являются перекрестным частным набором данных.
Одна обычно используемая стратегия того, чтобы заполнить отсутствующие значения в перекрестных частных данных состоит в том, чтобы создать модель регрессии, чтобы предсказать отсутствующие значения подряд из ненедостающих данных в той строке. Простой график рассеивания указывает, что существует отношение логарифмического журнала между областью много и ее фасадом. То отношение предлагает модель.
loglog(housing.LotArea,housing.LotFrontage,'o')
Можно использовать то отношение логарифмического журнала, чтобы заполнить недостающий LotFrontage
значения путем регрессирования значений на LotArea
.
missingValues = ismissing(housing.LotFrontage); beta = polyfit(log(housing.LotArea(~missingValues)),log(housing.LotFrontage(~missingValues)),1); housing.LotFrontage(missingValues) = exp(polyval(beta,log(housing.LotArea(missingValues))));
Можно использовать запись через точку, чтобы работать над данными в таблице, когда вы используете функции, такие как polyfit
и polyval
это принимает числовые векторы, но не таблицы. Можно думать о таблице как о контейнере, который спроектирован, чтобы содержать данные, имеющие различные типы. Функционирует, такие как polyfit
это специально для числовых входных параметров, не работают над таблицей, потому что таблица часто содержит нечисловые данные. Даже когда таблица содержит только числовые данные, это - все еще контейнер. Функции должны быть применены к содержимому таблицы. Используйте запись через точку, чтобы получить доступ к табличным переменным.
Добавьте оценочные отсутствующие значения, которые вы вычислили с polyfit
и polyval
к графику рассеивания. Простая схема обвинения не может быть достаточной в действительном анализе этих данных, но это иллюстрирует, как визуализировать и сделать расчеты на числовых данных в таблице.
hold on loglog(housing.LotArea(missingValues),housing.LotFrontage(missingValues),'rx') hold off
Запись через точку была удобна для операций, таких как преобразование существующей табличной переменной, добавление новой переменной, присвоение значений, графический вывод и применение функций как polyval
к табличной переменной. Запись через точку также удобна для арифметических операций на табличных переменных. Например, преобразуйте LotFrontage
переменная от ног до метров.
housing.LotFrontage = 0.3048 * housing.LotFrontage; housing.Properties.VariableUnits("LotFrontage") = "m"
housing=2928×24 table
PID MSSubClass LotFrontage LotArea Neighborhood BldgType OverallCond YearBuilt YearRemod_Add Foundation Heating CentralAir FirstFlrArea SecondFlrArea LowQualFinishedArea TotalAboveGroundLivingArea BsmtFullBath BsmtHalfBath FullBath HalfBath BedroomAbvGr GarageType SalePrice LastSoldDate
____________ _____________________________________________________ ___________ _______ ____________ ______________________ ___________ _________ _____________ __________ _______ __________ ____________ _____________ ___________________ __________________________ ____________ ____________ ________ ________ ____________ __________ _________ ____________
"0526301100" 1-STORY 1946 & NEWER ALL STYLES 42.977 31770 NAmes Single-family Detached 5 1960 1960 CBlock GasA true 1656 0 0 1656 1 0 1 0 3 Attchd 2.15e+05 Apr 2010
"0526350040" 1-STORY 1946 & NEWER ALL STYLES 24.384 11622 NAmes Single-family Detached 6 1961 1961 CBlock GasA true 896 0 0 896 0 0 1 0 2 Attchd 1.05e+05 May 2010
"0526351010" 1-STORY 1946 & NEWER ALL STYLES 24.689 14267 NAmes Single-family Detached 6 1958 1958 CBlock GasA true 1329 0 0 1329 0 0 1 1 3 Attchd 1.72e+05 May 2010
"0526353030" 1-STORY 1946 & NEWER ALL STYLES 28.346 11160 NAmes Single-family Detached 5 1968 1968 CBlock GasA true 2110 0 0 2110 1 0 2 1 3 Attchd 2.44e+05 Mar 2010
"0527105010" 2-STORY 1946 & NEWER 22.555 13830 Gilbert Single-family Detached 5 1997 1998 PConc GasA true 928 701 0 1629 0 0 2 1 3 Attchd 1.899e+05 Feb 2010
"0527105030" 2-STORY 1946 & NEWER 23.774 9978 Gilbert Single-family Detached 6 1998 1998 PConc GasA true 926 678 0 1604 0 0 2 1 3 Attchd 1.955e+05 May 2010
"0527127150" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 12.497 4920 StoneBr Townhouse Inside Unit 5 2001 2001 PConc GasA true 1338 0 0 1338 1 0 2 0 2 Attchd 2.135e+05 Mar 2010
"0527145080" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 13.106 5005 StoneBr Townhouse Inside Unit 5 1992 1992 PConc GasA true 1280 0 0 1280 0 0 2 0 2 Attchd 1.915e+05 Dec 2009
"0527146030" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 11.887 5389 StoneBr Townhouse Inside Unit 5 1995 1996 PConc GasA true 1616 0 0 1616 1 0 2 0 2 Attchd 2.365e+05 Feb 2010
"0527162130" 2-STORY 1946 & NEWER 18.288 7500 Gilbert Single-family Detached 5 1999 1999 PConc GasA true 1028 776 0 1804 0 0 2 1 3 Attchd 1.89e+05 May 2010
"0527163010" 2-STORY 1946 & NEWER 22.86 10000 Gilbert Single-family Detached 5 1993 1994 PConc GasA true 763 892 0 1655 0 0 2 1 3 Attchd 1.759e+05 Mar 2010
"0527165230" 1-STORY 1946 & NEWER ALL STYLES 19.049 7980 Gilbert Single-family Detached 7 1992 2007 PConc GasA true 1187 0 0 1187 1 0 2 0 3 Attchd 1.85e+05 Feb 2010
"0527166040" 2-STORY 1946 & NEWER 19.202 8402 Gilbert Single-family Detached 5 1998 1998 PConc GasA true 789 676 0 1465 0 0 2 1 3 Attchd 1.804e+05 Apr 2010
"0527180040" 1-STORY 1946 & NEWER ALL STYLES 25.908 10176 Gilbert Single-family Detached 5 1990 1990 PConc GasA true 1341 0 0 1341 1 0 1 1 2 Attchd 1.715e+05 Jan 2010
"0527182190" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 17.465 6820 StoneBr Townhouse Inside Unit 5 1985 1985 PConc GasA true 1502 0 0 1502 1 0 1 1 1 Attchd 2.12e+05 May 2010
"0527216070" 2-STORY 1946 & NEWER 14.326 53504 StoneBr Single-family Detached 5 2003 2003 PConc GasA true 1690 1589 0 3279 1 0 3 1 4 BuiltIn 5.38e+05 May 2010
⋮
Используя средние значения записи через точку, что умножение применяется не к housing
таблица, которая не может быть сделана, потому что таблицы являются контейнерами, а скорее к ее LotFrontage
переменная, которая является числовым вектором. С записью через точку вы извлекли LotFrontage
из таблицы и отложенный модифицированная версия в.
Другой способ получить доступ к содержимому таблицы к индексу в него при помощи фигурных скобок, так же, как вы используете фигурные скобки, чтобы извлечь содержимое массива ячеек. Можно использовать изогнутое индексирование фигурной скобки, чтобы относиться к и работать с данными в таблице путем извлечения и перевставки содержимого. Например, преобразуйте LotFrontage
назад к ногам при помощи изогнутого индексирования фигурной скобки.
housing{:,"LotFrontage"} = housing{:,"LotFrontage"} / 0.3048; housing.Properties.VariableUnits("LotFrontage") = "ft";
Запись через точку и индексирование фигурной скобки являются различными синтаксисами для тех же видов операций. Они оба работают над содержимым таблицы. Кроме того, они оба позволяют вам задать табличную переменную и подмножество ее строк.
housing.LotArea(1:2)
ans = 2×1
31770
11622
housing{1:2,"LotArea"}
ans = 2×1
31770
11622
В то время как оба синтаксиса работают над содержимым таблицы, существует два тонких различия, чтобы рассмотреть.
Во-первых, ограничение изогнутого индексирования фигурной скобки - то, что оно присваивает в содержимое таблицы вместо замены переменной. Например, это присвоение не изменяет тип данных LotFrontage
переменная в способе, которым делает присвоение с помощью записи через точку. Вызов single
функция на правой стороне присвоения создает массив, имеющий single
тип данных. Но путем индексирования в housing
с фигурными скобками вы присваиваете значения от того массива в существующую табличную переменную. И тип данных LotFrontage
double
. Значения с правой стороны преобразованы назад в double
этим присвоением.
housing{:,"LotFrontage"} = single(housing{:,"LotFrontage"});
Во-вторых, преимущество изогнутого индексирования фигурной скобки - то, что, в отличие от записи через точку, оно использует знакомый двумерный синтаксис индексирования. Этот синтаксис позволяет вам обратиться больше чем к одной переменной за один раз и также к подмножеству строк. Например, существует пять переменных, модули которых являются квадратными футами. Преобразование этих переменных к квадратным метрам по одному утомительно. Чтобы применить умножение ко всем пяти переменным целиком, используйте изогнутое индексирование фигурной скобки.
areaVars = ["LotArea" "FirstFlrArea" "SecondFlrArea" "LowQualFinishedArea" "TotalAboveGroundLivingArea"]; housing{:,areaVars} = 0.3048^2 * housing{:,areaVars}; housing.Properties.VariableUnits(areaVars) = "m^2";
Частая ошибка состоит в том, чтобы использовать индексирование круглой скобки вместо фигурных скобок, чтобы работать с содержимым таблицы. В то время как некоторые функции, такие как ismissing
или varfun
, действительно примите таблицу как их вход, много числовых операций, включая арифметику, сделайте нет. Например, это присвоение с помощью круглых скобок приводит к ошибке. try-catch
блок фиксирует ошибку и отображает ее.
try housing(:,areaVars) = 0.3048^2 * housing(:,areaVars); catch ME disp(ME.message) end
Undefined function 'mtimes' for input arguments of type 'table'.
Это присвоение приводит к ошибке потому что housing(:,areaVars)
2928 5 таблица, не числовая матрица. Если вы использовали изогнутое индексирование фигурной скобки, такое как housing{:,areaVars}
, затем результатом была бы 2928 5 числовая матрица. Поскольку таблицы спроектированы, чтобы содержать данные различных типов, включая нечисловые данные много функций, которые целесообразны только для числовых данных, не работают над таблицей. Запись через точку и изогнутое индексирование фигурной скобки существуют, чтобы дать, вы получаете доступ к данным в таблице.
Третий способ сделать вычисления на числовых переменных в таблице состоит в том, чтобы использовать varfun
функция. Как изогнутое индексирование фигурной скобки, varfun
может работать со всеми или только некоторыми переменными в таблице. В отличие от фигурных скобок, varfun
работает с каждой табличной переменной отдельно. По умолчанию, varfun
возвращает другую таблицу, содержащую переменную для каждого отдельного результата.
Иногда операция, которую вы хотите применить, является существующей функцией. Передать функцию в качестве аргумента к varfun
, используйте указатель на функцию. Например, используйте round
функционируйте к круглым данным в переменных, заданных areaVars
.
roundedAreaTable = varfun(@round,housing,"InputVariables",areaVars)
roundedAreaTable=2928×5 table
round_LotArea round_FirstFlrArea round_SecondFlrArea round_LowQualFinishedArea round_TotalAboveGroundLivingArea
_____________ __________________ ___________________ _________________________ ________________________________
2952 154 0 0 154
1080 83 0 0 83
1325 123 0 0 123
1037 196 0 0 196
1285 86 65 0 151
927 86 63 0 149
457 124 0 0 124
465 119 0 0 119
501 150 0 0 150
697 96 72 0 168
929 71 83 0 154
741 110 0 0 110
781 73 63 0 136
945 125 0 0 125
634 140 0 0 140
4971 157 148 0 305
⋮
Если нет никакой функции, которая делает точно, что вы хотите, можно также записать анонимную функцию, чтобы сделать это.
sqMeters2sqFeet = @(x) x / 0.3048^2;
areaTable = varfun(sqMeters2sqFeet,housing,"InputVariables",areaVars)
areaTable=2928×5 table
Fun_LotArea Fun_FirstFlrArea Fun_SecondFlrArea Fun_LowQualFinishedArea Fun_TotalAboveGroundLivingArea
___________ ________________ _________________ _______________________ ______________________________
31770 1656 0 0 1656
11622 896 0 0 896
14267 1329 0 0 1329
11160 2110 0 0 2110
13830 928 701 0 1629
9978 926 678 0 1604
4920 1338 0 0 1338
5005 1280 0 0 1280
5389 1616 0 0 1616
7500 1028 776 0 1804
10000 763 892 0 1655
7980 1187 0 0 1187
8402 789 676 0 1465
10176 1341 0 0 1341
6820 1502 0 0 1502
53504 1690 1589 0 3279
⋮
Поскольку тем результатом является таблица, он может быть присвоен назад в исходную таблицу с индексированием круглой скобки.
housing(:,areaVars) = areaTable;
housing.Properties.VariableUnits(areaVars) = "ft^2";
Важно изучить различие между круглыми скобками в
housing(:,areaVars) = areaTable;
и фигурные скобки в
housing{:,areaVars} = 0.3048^2 * housing{:,areaVars};
Эти два присвоения оказывают то же влияние. Присвоение с круглыми скобками присваивает одну таблицу другому. Присвоение с фигурными скобками явным образом присваивает значения содержимому таблицы. Левые и правые стороны того присвоения являются числовыми матрицами. Поскольку изогнутое индексирование фигурной скобки извлекает и повторно вставляет данные, это - удобный способ изменить данные на месте. Присвоение от содержимого к содержимому может работать только с одним типом данных за один раз, в то время как присвоение от таблицы к таблице может переместить данные различных типов. Например, это присвоение приводит к ошибке, потому что оно включает смешанный числовой и categorical
данные в индексировании фигурной скобки.
try housing{:,["LotFrontage" "OverallCond"]} = normalize(housing{:,["LotFrontage" "OverallCond"]}); catch ME disp(ME.message) end
Unable to concatenate the specified table variables.
Поскольку varfun
возвращает таблицу, присвоение с помощью индексирования круглой скобки не может изменить тип никаких табличных переменных. Например, это присвоение не преобразует переменных из double
к single
тип данных.
housing(:,areaVars) = varfun(@single,housing,"InputVariables",areaVars);
Чтобы преобразовать типы данных табличных переменных, используйте convertvars
, как ранее показано.
Поскольку изогнутое индексирование фигурной скобки извлекает переменные из таблицы как одна матрица, имеющая один тип данных, можно использовать его, чтобы выполнить операции строки через числовые переменные в таблице. Например, проверка на данных должна сравнить отдельные переменные площади в квадратных футах с TotalAboveGroundLivingArea
. Извлеките первого при помощи фигурных скобок. Затем сравните их суммы строки с TotalAboveGroundLivingArea
, извлеченный при помощи записи через точку.
area = housing{:,["FirstFlrArea" "SecondFlrArea" "LowQualFinishedArea"]}
area = 2928×3
1656 0 0
896 0 0
1329 0 0
2110 0 0
928 701 0
926 678 0
1338 0 0
1280 0 0
1616 0 0
1028 776 0
⋮
isequal(sum(area,2), housing.TotalAboveGroundLivingArea)
ans = logical
1
Данные о площади в квадратных футах сопоставимы. Другой пример должен вычислить общее количество ванных в каждом доме путем извлечения четырех различных количеств ванной и складывания их через каждую строку.
bathCountVars = ["BsmtHalfBath" "HalfBath" "BsmtFullBath" "FullBath"]; bathCounts = housing{:,bathCountVars}
bathCounts = 2928×4
0 0 1 1
0 0 0 1
0 1 0 1
0 1 1 2
0 1 0 2
0 1 0 2
0 0 1 2
0 0 0 2
0 0 1 2
0 1 0 2
⋮
Вы можете думать, чтобы суммировать строки той матрицы как:
sum(housing{:,bathCountVars},2);
но та сумма не правильна. Полуванны считают только вдвое меньше, чем все ванные. Тренд в списках недвижимости с учетом нескольких полуванн путем подсчета их после десятичной точки. Умножение матриц делает ту операцию одной линией.
TotalBaths = housing{:,bathCountVars} * [.1; .1; 1; 1];
Замените те четыре переменные на TotalBaths
, вместо того, чтобы добавлять новую переменную в конце таблицы. Начните эту замену при помощи addvars
добавить TotalBaths
рядом с существующими переменными.
housing = addvars(housing,TotalBaths, 'After',"HalfBath");
Существует ошибка в одной строке данных. Особняк, созданный в 2 007, вероятно, не имеет четырех половин ванн и никаких полных ванн.
groupcounts(housing,"TotalBaths")
ans=17×3 table
TotalBaths GroupCount Percent
__________ __________ ________
0.4 1 0.034153
1 442 15.096
1.1 293 10.007
1.2 20 0.68306
1.3 2 0.068306
2 890 30.396
2.1 558 19.057
2.2 29 0.99044
3 349 11.919
3.1 288 9.8361
3.2 6 0.20492
3.3 1 0.034153
4 25 0.85383
4.1 16 0.54645
4.2 3 0.10246
6 2 0.068306
⋮
housing(housing.TotalBaths < 1,:)
ans=1×25 table
PID MSSubClass LotFrontage LotArea Neighborhood BldgType OverallCond YearBuilt YearRemod_Add Foundation Heating CentralAir FirstFlrArea SecondFlrArea LowQualFinishedArea TotalAboveGroundLivingArea BsmtFullBath BsmtHalfBath FullBath HalfBath TotalBaths BedroomAbvGr GarageType SalePrice LastSoldDate
____________ _____________________________________________________ ___________ _______ ____________ _____________________ ___________ _________ _____________ __________ _______ __________ ____________ _____________ ___________________ __________________________ ____________ ____________ ________ ________ __________ ____________ __________ _________ ____________
"0528228275" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 53 3922 Blmngtn Townhouse Inside Unit 5 2006 2007 PConc GasA true 1402 0 0 1402 0 2 0 2 0.4 2 Attchd 1.942e+05 Jan 2007
BsmtHalfBath
количество должно быть двумя всеми ванными. Количества ванной являются все числовыми. Присвоение с фигурными скобками обновляет все три значения через ту строку.
housing{housing.TotalBaths < 1,["BsmtHalfBath" "FullBath" "TotalBaths"]} = [0 2 2.2];
Затем используйте removevars
удалить избыточные исходные переменные.
housing = removevars(housing,bathCountVars)
housing=2928×21 table
PID MSSubClass LotFrontage LotArea Neighborhood BldgType OverallCond YearBuilt YearRemod_Add Foundation Heating CentralAir FirstFlrArea SecondFlrArea LowQualFinishedArea TotalAboveGroundLivingArea TotalBaths BedroomAbvGr GarageType SalePrice LastSoldDate
____________ _____________________________________________________ ___________ _______ ____________ ______________________ ___________ _________ _____________ __________ _______ __________ ____________ _____________ ___________________ __________________________ __________ ____________ __________ _________ ____________
"0526301100" 1-STORY 1946 & NEWER ALL STYLES 141 31770 NAmes Single-family Detached 5 1960 1960 CBlock GasA true 1656 0 0 1656 2 3 Attchd 2.15e+05 Apr 2010
"0526350040" 1-STORY 1946 & NEWER ALL STYLES 80 11622 NAmes Single-family Detached 6 1961 1961 CBlock GasA true 896 0 0 896 1 2 Attchd 1.05e+05 May 2010
"0526351010" 1-STORY 1946 & NEWER ALL STYLES 81 14267 NAmes Single-family Detached 6 1958 1958 CBlock GasA true 1329 0 0 1329 1.1 3 Attchd 1.72e+05 May 2010
"0526353030" 1-STORY 1946 & NEWER ALL STYLES 93 11160 NAmes Single-family Detached 5 1968 1968 CBlock GasA true 2110 0 0 2110 3.1 3 Attchd 2.44e+05 Mar 2010
"0527105010" 2-STORY 1946 & NEWER 74 13830 Gilbert Single-family Detached 5 1997 1998 PConc GasA true 928 701 0 1629 2.1 3 Attchd 1.899e+05 Feb 2010
"0527105030" 2-STORY 1946 & NEWER 78 9978 Gilbert Single-family Detached 6 1998 1998 PConc GasA true 926 678 0 1604 2.1 3 Attchd 1.955e+05 May 2010
"0527127150" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 41 4920 StoneBr Townhouse Inside Unit 5 2001 2001 PConc GasA true 1338 0 0 1338 3 2 Attchd 2.135e+05 Mar 2010
"0527145080" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 43 5005 StoneBr Townhouse Inside Unit 5 1992 1992 PConc GasA true 1280 0 0 1280 2 2 Attchd 1.915e+05 Dec 2009
"0527146030" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 39 5389 StoneBr Townhouse Inside Unit 5 1995 1996 PConc GasA true 1616 0 0 1616 3 2 Attchd 2.365e+05 Feb 2010
"0527162130" 2-STORY 1946 & NEWER 60 7500 Gilbert Single-family Detached 5 1999 1999 PConc GasA true 1028 776 0 1804 2.1 3 Attchd 1.89e+05 May 2010
"0527163010" 2-STORY 1946 & NEWER 75 10000 Gilbert Single-family Detached 5 1993 1994 PConc GasA true 763 892 0 1655 2.1 3 Attchd 1.759e+05 Mar 2010
"0527165230" 1-STORY 1946 & NEWER ALL STYLES 62.496 7980 Gilbert Single-family Detached 7 1992 2007 PConc GasA true 1187 0 0 1187 3 3 Attchd 1.85e+05 Feb 2010
"0527166040" 2-STORY 1946 & NEWER 63 8402 Gilbert Single-family Detached 5 1998 1998 PConc GasA true 789 676 0 1465 2.1 3 Attchd 1.804e+05 Apr 2010
"0527180040" 1-STORY 1946 & NEWER ALL STYLES 85 10176 Gilbert Single-family Detached 5 1990 1990 PConc GasA true 1341 0 0 1341 2.1 2 Attchd 1.715e+05 Jan 2010
"0527182190" 1-STORY PUD (Planned Unit Development) - 1946 & NEWER 57.299 6820 StoneBr Townhouse Inside Unit 5 1985 1985 PConc GasA true 1502 0 0 1502 2.1 1 Attchd 2.12e+05 May 2010
"0527216070" 2-STORY 1946 & NEWER 47 53504 StoneBr Single-family Detached 5 2003 2003 PConc GasA true 1690 1589 0 3279 4.1 4 BuiltIn 5.38e+05 May 2010
⋮
В отличие от фигурных скобок, varfun
работает с каждой переменной в таблице отдельно. По этой причине, varfun
не может сделать операций строки. Связанный функциональный rowfun
может сделать операции строки. Это часто более просто и быстрее, чтобы использовать изогнутое индексирование фигурной скобки для операций строки.
В предыдущих разделах операции на числовых данных в таблице были преобразованиями, которые заменяют исходные значения. Много других важных операций являются сокращениями, результатами которых являются скаляры. Например, вычислите среднюю цену значений в SalePrice
.
median(housing.SalePrice)
ans = 160000
median
функция работает по столбцам над матрицами. Можно использовать изогнутое индексирование фигурной скобки, чтобы извлечь те четыре переменные как числовую матрицу. Затем можно вычислить медианы столбцов матрицы.
median(housing{:,["LotFrontage", "LotArea" "TotalAboveGroundLivingArea" "SalePrice"]})
ans = 1×4
105 ×
0.0007 0.0944 0.0144 1.6000
Эта операция не присоединяет имена переменных или любые другие табличные метаданные к результату. Как альтернатива, можно использовать varfun
применять median
к каждой переменной в таблице. С varfun
, результатом является другая таблица, которая содержит отдельные числовые результаты и сохраняет имена.
varfun(@median,housing,"InputVariables",["LotFrontage", "LotArea" "TotalAboveGroundLivingArea" "SalePrice"])
ans=1×4 table
median_LotFrontage median_LotArea median_TotalAboveGroundLivingArea median_SalePrice
__________________ ______________ _________________________________ ________________
69.183 9436.5 1442 1.6e+05
Эти два способа получить медианы эквивалентны. Существует компромисс между сохранением имен переменных в другой таблице и наличием результатов в одном числовом векторе-строке. Путем вы выбираете, зависит от того, что вы планируете сделать результатом.
Используя фигурные скобки, когда вычисление медиан имеет другой недостаток. Фигурные скобки требуют совместимого типа данных для всех переменных. Таким образом, данные, которые вы извлекаете из переменных, должны иметь типы данных, которые позволяют им быть конкатенированными в одну матрицу. Порядковый categorical
данные могут также иметь средние значения. Поскольку categorical
и числовые массивы не могут объединяться, эта операция результаты по ошибке.
median(housing{:,["LotFrontage", "LotArea" "OverallCond" "TotalAboveGroundLivingArea" "SalePrice"]})
Но потому что varfun
работает с каждой переменной в таблице отдельно, нет никакого требования, чтобы переменные имели совпадающий тип данных или совместимые типы, позволяющие конкатенацию. Единственное требование - то, что все переменные должны поддерживать функцию, которая применяется. Вычислить медианы порядкового categorical
переменные и числовые переменные в одном вызове функции используют varfun
.
varfun(@median,housing,"InputVariables",["LotFrontage", "LotArea" "OverallCond" "TotalAboveGroundLivingArea" "SalePrice"])
ans=1×5 table
median_LotFrontage median_LotArea median_OverallCond median_TotalAboveGroundLivingArea median_SalePrice
__________________ ______________ __________________ _________________________________ ________________
69.183 9436.5 5 1442 1.6e+05
categorical
| table
| readtable
| varfun
| renamevars
| convertvars
| summary
| ismissing
| rmmissing
| datetime
| removevars
| addvars
| groupcounts