테이블 사용의 이점
단일 컨테이너에 혼합형 데이터를 간편하게 저장하기
table
데이터형을 사용하여 변수 이름, 행 이름, 설명, 변수 단위와 같은 혼합형 데이터 속성과 메타데이터 속성을 단일 컨테이너에 수집할 수 있습니다. 테이블은 텍스트 파일 또는 스프레드시트에서 주로 열로 저장되는 열 방향 데이터 또는 테이블 형식 데이터에 적합합니다. 예를 들어, 행에 여러 관측값을 나타내고 열에 여러 측정된 변수를 나타내는 방식으로 테이블을 사용하여 실험 데이터를 저장할 수 있습니다.
테이블은 열 방향 변수와 행으로 구성됩니다. 테이블에 포함된 변수 각각은 데이터형과 크기가 서로 다를 수 있습니다. 그러나 각 변수의 행 개수는 동일해야 합니다.
예를 들어, 샘플 환자 데이터를 불러와 보겠습니다.
load patients
그런 다음, 작업 공간 변수 Systolic
과 Diastolic
을 단일 BloodPressure
변수로 결합한 후 작업 공간 변수 SelfAssessedHealthStatus
를 문자형 벡터로 구성된 셀형 배열에서 categorical
형 배열로 변환합니다.
BloodPressure = [Systolic Diastolic]; SelfAssessedHealthStatus = categorical(SelfAssessedHealthStatus); whos("Age","Smoker","BloodPressure","SelfAssessedHealthStatus")
Name Size Bytes Class Attributes Age 100x1 800 double BloodPressure 100x2 1600 double SelfAssessedHealthStatus 100x1 560 categorical Smoker 100x1 100 logical
변수 Age
, BloodPressure
, SelfAssessedHealthStatus
, Smoker
는 다양한 데이터형을 사용하며, 행의 개수가 모두 동일하므로(100) 하나의 테이블에 저장할 수 있습니다.
이제, 변수에서 테이블을 생성하고 표시합니다.
T = table(Age,Smoker,BloodPressure,SelfAssessedHealthStatus)
T=100×4 table
Age Smoker BloodPressure SelfAssessedHealthStatus
___ ______ _____________ ________________________
38 true 124 93 Excellent
43 false 109 77 Fair
38 false 125 83 Good
40 false 117 75 Fair
49 false 122 80 Good
46 false 121 70 Good
33 true 130 88 Good
40 false 115 82 Good
28 false 115 78 Excellent
31 false 118 86 Excellent
45 false 114 77 Excellent
42 false 115 68 Poor
25 false 127 74 Poor
39 true 130 95 Excellent
36 false 114 79 Good
48 true 130 92 Good
⋮
이 테이블은 맨 위에 변수 이름이 위치하는 테이블 형식으로 표시됩니다.
테이블에 포함된 변수 각각은 단일 데이터형입니다. 새 행을 테이블에 추가하는 경우 MATLAB®은 새 데이터와 이에 대응되는 테이블 변수 사이의 데이터형을 일관되게 유지합니다. 예를 들어, 새 환자에 대해 첫 번째 열에 환자의 연령 대신 건강 상태를 포함하는 정보를 추가하려고 T(end+1,:) = {"Poor",true,[130 84],37}
과 같은 표현식을 사용하면 다음과 같은 오류가 발생합니다.
Right hand side of an assignment to a categorical array must be a categorical or text representing a category name.
오류가 발생하는 이유는 MATLAB®이 categorical형 배열 SelfAssessedHealthStatus
에 숫자형 데이터 37
을 할당할 수 없기 때문입니다.
구조체와 테이블을 비교하기 위해 테이블 T
와 동일한 구조체형 배열 StructArray
를 가정해 보겠습니다.
StructArray = table2struct(T)
StructArray=100×1 struct array with fields:
Age
Smoker
BloodPressure
SelfAssessedHealthStatus
구조체형 배열은 명명된 필드를 사용하여 레코드를 구성합니다. 필드의 값은 각각 다른 데이터형 또는 크기를 가질 수 있습니다. 이제, StructArray
의 첫 번째 요소에 대한 명명된 필드를 표시합니다.
StructArray(1)
ans = struct with fields:
Age: 38
Smoker: 1
BloodPressure: [124 93]
SelfAssessedHealthStatus: Excellent
구조체형 배열의 필드는 테이블의 변수와 비슷합니다. 그러나, 테이블과 달리 하나의 필드 내에서 동질성이 유지되도록 강제할 수 없습니다. 예를 들어, S.SelfAssessedHealthStatus
의 값이 일부는 Poor
또는 Good
같은 categorical형 배열 요소이고, 다른 일부는 "Poor"
와 "Good"
같은 string형이고, 또 다른 일부는 0
또는 1
같은 정수일 수 있습니다.
이제 각 필드가 테이블의 한 개 변수에 해당하는, 4개의 필드로 구성된 스칼라 구조체에 동일한 데이터가 저장되어 있다고 가정해 보겠습니다.
ScalarStruct = struct(... "Age",Age,... "Smoker",Smoker,... "BloodPressure",BloodPressure,... "SelfAssessedHealthStatus",SelfAssessedHealthStatus)
ScalarStruct = struct with fields:
Age: [100x1 double]
Smoker: [100x1 logical]
BloodPressure: [100x2 double]
SelfAssessedHealthStatus: [100x1 categorical]
테이블과 달리, 데이터가 사각형이 되도록 강제할 수 없습니다. 예를 들어, 필드 ScalarStruct.Age
의 길이는 다른 필드와 다를 수 있습니다.
테이블을 사용하여 (구조체형 배열처럼) 사각형 구조체를 유지하고 (스칼라 구조체의 필드처럼) 변수의 동질성을 강제할 수 있습니다. 셀형 배열은 명명된 필드는 없지만 구조체형 배열 및 스칼라 구조체와 동일한 많은 단점을 가지고 있습니다. 각 변수에 사각형의 동종 데이터가 있는 경우 테이블을 사용해 보십시오. 그러면 숫자 인덱싱 또는 이름 인덱싱 방법을 사용할 수 있으며 테이블 속성을 사용하여 메타데이터를 저장할 수 있습니다.
숫자 인덱싱(Numeric Indexing)이나 이름 인덱싱(Named Indexing)으로 데이터에 액세스하기
괄호, 중괄호, 점 인덱싱 중 하나를 사용하여 테이블의 요소를 참조할 수 있습니다. 괄호를 사용하여 테이블에서 데이터 서브셋을 선택하고 테이블 컨테이너를 유지할 수 있습니다. 중괄호와 점 인덱싱을 사용하여 테이블에서 데이터를 추출할 수 있습니다. 각각의 테이블 인덱싱 메서드 내에, 이름이나 숫자 인덱스를 사용하여 액세스할 행 또는 변수를 지정할 수 있습니다.
위의 샘플 테이블을 살펴보겠습니다. 테이블 T
의 각 행은 개별 환자를 나타냅니다. 작업 공간 변수 LastName
에는 100개 행에 대한 고유 식별자가 포함되어 있습니다. RowNames
속성을 LastName
으로 설정하여 행 이름을 테이블에 추가하고, 업데이트된 테이블에서 처음 5개 행을 표시합니다.
T.Properties.RowNames = LastName; T(1:5,:)
ans=5×4 table
Age Smoker BloodPressure SelfAssessedHealthStatus
___ ______ _____________ ________________________
Smith 38 true 124 93 Excellent
Johnson 43 false 109 77 Fair
Williams 38 false 125 83 Good
Jones 40 false 117 75 Fair
Brown 49 false 122 80 Good
행 이름과 변수 이름을 사용하면 데이터에 레이블을 지정하는 것은 물론, 테이블의 데이터에도 액세스할 수 있습니다. 예를 들어, 이름 인덱싱을 사용하여 Williams
라는 환자와 Brown
이라는 환자의 연령과 혈압을 표시합니다.
T(["Williams","Brown"],["Age","BloodPressure"])
ans=2×2 table
Age BloodPressure
___ _____________
Williams 38 125 83
Brown 49 122 80
이제, 숫자 인덱싱을 사용하여 해당하는 하위 테이블을 반환합니다. 첫 번째 변수와 세 번째 변수에서 세 번째 행과 다섯 번째 행을 반환합니다.
T([3 5],[1 3])
ans=2×2 table
Age BloodPressure
___ _____________
Williams 38 125 83
Brown 49 122 80
셀형 배열 또는 구조체형의 경우, 이름 인덱싱 또는 숫자 인덱싱을 이처럼 유연하게 사용할 수 없습니다.
셀형 배열에서는
strcmp
를 사용하여 원하는 명명된 데이터를 찾아야 합니다. 그래야만 배열의 요소를 참조할 수 있습니다.스칼라 구조체 또는 구조체형 배열의 경우 번호로 필드를 참조할 수 없습니다. 또한, 스칼라 구조체의 경우 변수의 서브셋이나 관측값의 서브셋을 손쉽게 선택할 수 없습니다. 구조체형 배열의 경우, 관측값의 서브셋을 선택할 수 있지만, 변수의 서브셋은 선택할 수 없습니다.
테이블에서는 이름 인덱스 또는 숫자 인덱스를 기준으로 데이터에 액세스할 수 있습니다. 또한 변수의 서브셋과 행의 서브셋을 손쉽게 선택할 수 있습니다.
테이블 인덱싱에 대한 자세한 내용은 테이블의 데이터에 액세스하기 항목을 참조하십시오.
테이블 속성을 사용하여 메타데이터 저장하기
테이블에는 데이터를 저장하는 것은 물론 변수 이름, 행 이름, 설명, 변수 단위와 같은 메타데이터를 저장할 수 있는 속성이 있습니다. T
.Properties.
PropName
을 사용하여 속성에 액세스할 수 있습니다. 여기서 T
는 테이블의 이름이고 PropName
은 테이블 속성의 이름입니다.
예를 들어, Age
에 대한 테이블 설명, 변수 설명, 변수 단위를 추가해 보겠습니다.
T.Properties.Description = "Simulated Patient Data"; T.Properties.VariableDescriptions = ... ["" ... "true or false" ... "Systolic/Diastolic" ... "Status Reported by Patient"]; T.Properties.VariableUnits("Age") = "Yrs";
VariableDescriptions
내의 빈 문자열은 각각 해당하는 변수에 설명이 없음을 나타냅니다. 자세한 내용은 table
의 속성 섹션을 참조하십시오.
테이블 요약을 출력하려면 summary
함수를 사용하십시오.
summary(T)
Description: Simulated Patient Data Variables: Age: 100x1 double Properties: Units: Yrs Values: Min 25 Median 39 Max 50 Smoker: 100x1 logical Properties: Description: true or false Values: True 34 False 66 BloodPressure: 100x2 double Properties: Description: Systolic/Diastolic Values: Column 1 Column 2 ________ ________ Min 109 68 Median 122 81.5 Max 138 99 SelfAssessedHealthStatus: 100x1 categorical Properties: Description: Status Reported by Patient Values: Excellent 34 Fair 15 Good 40 Poor 11
구조체와 셀형 배열에는 메타데이터를 저장할 수 있는 속성이 없습니다.