Main Content

varfun

関数をテーブル変数または timetable 変数に適用

説明

B = varfun(func,A) は、関数 func を table または timetable A の各変数に個別に適用し、結果を table または timetable B で返します。

関数 func は入力引数を 1 つ取り、この関数が呼び出されるたびに、同じ行数の配列を返さなければなりません。出力引数 B{:,i}i 番目の値は func(A{:,i}) と等しくなります。

B = varfun(func,A,Name,Value) は、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、名前と値の引数 GroupingVariables を使用して、table 変数内のデータのグループに対して計算を実行できます。データのグループに対する計算の詳細については、データ グループに対する計算を参照してください。

すべて折りたたむ

要素単位関数を table の変数に適用します。

数値変数を含む table を作成します。

A = table([10.71;-2.05;-0.35;-0.82;1.57],[9.23;3.12;-1.18;0.23;16.41])
A=5×2 table
    Var1     Var2 
    _____    _____

    10.71     9.23
    -2.05     3.12
    -0.35    -1.18
    -0.82     0.23
     1.57    16.41

関数 round を適用して、A の数値を丸めます。varfun への入力引数として関数を指定するには、@ 記号を使用します。出力 table の変数名は、関数名と入力 table の変数名に基づきます。

B = varfun(@round,A)
B=5×2 table
    round_Var1    round_Var2
    __________    __________

        11             9    
        -2             3    
         0            -1    
        -1             0    
         2            16    

最初の次元に沿って table 変数を削減する summax などの関数を適用できます。たとえば、varfun を使用して table 内の各変数の平均を計算します。

数値変数を含む table を作成します。

A = table([0.71;-2.05;-0.35;-0.82;1.57],[0.23;0.12;-0.18;0.23;0.41])
A=5×2 table
    Var1     Var2 
    _____    _____

     0.71     0.23
    -2.05     0.12
    -0.35    -0.18
    -0.82     0.23
     1.57     0.41

テーブルのすべての変数に関数 mean を適用します。出力 table には、入力 table の各変数の平均値が含まれます。

B = varfun(@mean,A)
B=1×2 table
    mean_Var1    mean_Var2
    _________    _________

     -0.188        0.162  

varfun が table ではなく数値ベクトルを返すようにするには、名前と値の引数 OutputFormat"uniform" として指定します。"uniform" 出力形式を使用するには、func は常にスカラーを返す必要があります。

B = varfun(@mean,A,"OutputFormat","uniform")
B = 1×2

   -0.1880    0.1620

数値データ変数、およびグループ化変数である非数値変数をもつ table を作成します。次に、数値変数内の各グループに対して計算を実行します。

CSV (コンマ区切り値) ファイルから table にデータを読み取ります。このサンプル ファイルには、2 つの異なる学校の生徒の 10 人分のテストの得点が含まれています。

scores = readtable("testScores.csv","TextType","string");
scores.School = categorical(scores.School)
scores=10×5 table
     LastName       School      Test1    Test2    Test3
    __________    __________    _____    _____    _____

    "Jeong"       XYZ School     90       87       93  
    "Collins"     XYZ School     87       85       83  
    "Torres"      XYZ School     86       85       88  
    "Phillips"    ABC School     75       80       72  
    "Ling"        ABC School     89       86       87  
    "Ramirez"     ABC School     96       92       98  
    "Lee"         XYZ School     78       75       77  
    "Walker"      ABC School     91       94       92  
    "Garcia"      ABC School     86       83       85  
    "Chang"       XYZ School     79       76       82  

各テストの平均点を学校別に計算します。変数 Test1Test2、および Test3 は数値データ変数です。変数 School はグループ化変数です。グループ化変数を指定すると、その一意の値により、データ変数内の対応する値が属するグループが定義されます。

vars = ["Test1","Test2","Test3"];
meanScoresBySchool = varfun(@mean, ...
                            scores, ...
                            "InputVariables",vars, ...
                            "GroupingVariables","School")
meanScoresBySchool=2×5 table
      School      GroupCount    mean_Test1    mean_Test2    mean_Test3
    __________    __________    __________    __________    __________

    ABC School        5            87.4            87          86.8   
    XYZ School        5              84          81.6          84.6   

出力 table には、そのグループに含まれる入力 table の行数を示す GroupCount という変数が含まれます。

サンプル データを含む timetable を作成します。行時間は重複することがあるため、timetable の行時間でグループを定義できます。

Timestamps = datetime(2023,1,1)+days([0 1 1 2 3 3])';
A = timetable(Timestamps, ...
              [0.71;-2.05;-0.35;-0.82;1.57;0.09], ...
              [0.23;0.12;-0.18;0.23;0.41;0.02], ...
              'VariableNames',["x","y"])
A=6×2 timetable
    Timestamps       x        y  
    ___________    _____    _____

    01-Jan-2023     0.71     0.23
    02-Jan-2023    -2.05     0.12
    02-Jan-2023    -0.35    -0.18
    03-Jan-2023    -0.82     0.23
    04-Jan-2023     1.57     0.41
    04-Jan-2023     0.09     0.02

timetable 内の変数の日単位の平均値を計算します。行時間のベクトルをグループ化変数として指定します。入力 A が timetable であるため、出力 B は timetable です。行時間のベクトルをグループ化変数として指定すると、いずれの変数も別のグループ化変数として指定できません。

B = varfun(@mean,A,"GroupingVariables","Timestamps")
B=4×3 timetable
    Timestamps     GroupCount    mean_x    mean_y
    ___________    __________    ______    ______

    01-Jan-2023        1          0.71      0.23 
    02-Jan-2023        2          -1.2     -0.03 
    03-Jan-2023        1         -0.82      0.23 
    04-Jan-2023        2          0.83     0.215 

関数を適用するときにオプション引数を渡すには、関数呼び出しを無名関数でラップします。

数値変数を含む table を作成します。table のいくつかの要素に NaN を割り当てます。

A = table([10.71;-2.05;NaN;-0.82;1.57],[9.23;NaN;-1.18;0.23;16.41])
A=5×2 table
    Var1     Var2 
    _____    _____

    10.71     9.23
    -2.05      NaN
      NaN    -1.18
    -0.82     0.23
     1.57    16.41

既定では、関数 mean は、入力配列に NaN がある場合は NaN を返します。

B = varfun(@mean,A)
B=1×2 table
    mean_Var1    mean_Var2
    _________    _________

       NaN          NaN   

mean を適用するときに NaN を除外するには、"omitnan" オプションを指定します。このオプションを mean を適用するときに使用するには、"omitnan" を指定する呼び出しを無名関数でラップします。

func = @(x) mean(x,"omitnan");

無名関数を適用して、"omitnan" で平均値を計算します。

C = varfun(func,A)
C=1×2 table
    Fun_Var1    Fun_Var2
    ________    ________

     2.3525      6.1725 

入力引数

すべて折りたたむ

関数。関数ハンドルとして指定します。既存の関数のハンドルを指定するか、ファイルで関数を定義するか、無名関数を指定できます。関数は 1 つの入力引数を受け取り、構文は次の形式でなければなりません。

result = f(arg)

A の変数に対して f を呼び出すには、次のように varfun の呼び出しで func を指定します。

func = @f;
B = varfun(func,A);

varfun は、A の変数ごとに、その変数に対して func を呼び出し、func の出力を出力 B の対応する変数として割り当てます。

追加の考慮事項を次にいくつか示します。

  • func が表す関数には、追加のオプション引数をもつ構文がほかにも含まれる場合があります。ただし、varfun が関数を呼び出すときは、入力引数を 1 つだけもつ構文を呼び出します。

    たとえば、関数 mean には "omitnan" などのオプション引数を指定する構文があります。ただし、func@mean として指定した場合、varfunmean(arg) 構文を使用して mean を呼び出します。

  • オプション引数をもつ関数を呼び出すには、無名関数でラップします。たとえば、"omitnan" オプションを指定した mean を呼び出すには、func@(x) mean(x,"omitnan") として指定します。

  • func が呼び出されるたびに異なる行数の配列を返す場合、名前と値の引数 OutputFormat"cell" として指定します。それ以外の場合、func は呼び出されるたびに同じ行数の配列を返さなければなりません。

  • func が複数の関数ファイルに対応している場合 (つまり、func がオーバーロードされた関数セットを表す場合)、MATLAB® は入力引数のクラスに基づいて呼び出す関数を決定します。

例: B = varfun(@mean,A) は、入力の平均値を計算します。

例: B = varfun(@(x) x.^2,A) は、入力の各要素の二乗を計算します。

例: B = varfun(@(x) mean(x,"omitnan"),A) は、"omitnan" オプションを指定した mean を呼び出します。

入力 table。table または timetable として指定します。

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

例: B = varfun(func,A,InputVariables=["Var2","Var3"]) は、AVar2 および Var3 という名前の変数のみを func への入力として使用します。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

例: B = varfun(func,A,"InputVariables",["Var2","Var3"]) は、AVar2 および Var3 という名前の変数のみを func への入力として使用します。

func に渡す A の変数。次の表のインデックス方式のいずれかを使用して指定します。

インデックス方式

変数名:

  • string 配列、文字ベクトル、または文字ベクトルの cell 配列

  • pattern オブジェクト

  • "A" または 'A'A という名前の変数

  • ["A","B"] または {'A','B'}A および B という名前の 2 つの変数

  • "Var"+digitsPattern(1)"Var" の後に数字 1 桁が続く名前の変数

変数インデックス:

  • table 内の変数の位置を参照するインデックス番号

  • 数値のベクトル

  • logical ベクトル。通常、このベクトルの長さは変数の数と同じですが、末尾の 0 値や false 値は省略できます。

  • 3 — table の 3 番目の変数

  • [2 3] — table の 2 番目と 3 番目の変数

  • [false false true] — 3 番目の変数

関数ハンドル:

  • 1 つの引数を入力として受け取り logical スカラーを返す関数のハンドル。関数の構文は次の形式でなければなりません。

    tf = f(arg)
    

    追加のオプション引数をもつ関数を適用する必要がある場合は、無名関数でラップします。

  • @isnumeric — 数値を含む入力引数に対して true を返す関数のハンドル

例: B = varfun(func,A,InputVariables=[1 3 4]) は、A の 1 番目、3 番目、および 4 番目の変数のみを func への入力として使用します。

例: B = varfun(func,A,InputVariables=@isnumeric) は、A の数値変数のみを func への入力として使用します。

グループ化変数として使用する A の変数。次の表のインデックス方式のいずれかを使用して指定します。

インデックス方式

変数名:

  • string 配列、文字ベクトル、または文字ベクトルの cell 配列

  • pattern オブジェクト

  • "A" または 'A'A という名前の変数

  • ["A","B"] または {'A','B'}A および B という名前の 2 つの変数

  • "Var"+digitsPattern(1)"Var" の後に数字 1 桁が続く名前の変数

変数インデックス:

  • table 内の変数の位置を参照するインデックス番号

  • 数値のベクトル

  • logical ベクトル。通常、このベクトルの長さは変数の数と同じですが、末尾の 0 値や false 値は省略できます。

  • 3 — table の 3 番目の変数

  • [2 3] — table の 2 番目と 3 番目の変数

  • [false false true] — 3 番目の変数

グループ化変数の一意の値によってグループが定義されます。A 内の行は、グループ化変数の値が同じであれば、同じグループに属します。varfun は、変数全体ではなく、A の残りの各変数内の行のグループごとに func を適用します。グループ化変数を使用した計算の詳細については、データ グループに対する計算を参照してください。

グループ化変数は、次の表にリストされているデータ型のいずれかにすることができます。

グループを指定する値

グループ化変数のデータ型

数字

数値または logical ベクトル

テキスト

string 配列または文字ベクトルの cell 配列

日付と時刻

datetimeduration または calendarDuration ベクトル

カテゴリ

categorical ベクトル

ビン

ビン化された値のベクトル。数値、datetime または duration 値の連続分布をビン化することによって作成される

多くのデータ型には、NaNNaT、未定義の categorical 値、欠損 string など、欠損値を表現する方法があります。いずれかのグループ化変数に欠損値を表現できるデータ型が含まれている場合、そのグループ化変数で欠損値が発生する行はどのグループにも属さず、出力から除外されます。

行ラベルはグループ化変数にすることができます。行ラベルのみ、A 内の 1 つ以上の変数、または行ラベルと変数を同じグループにすることができます。

  • A が table の場合、ラベルは行名です。

  • A が timetable の場合、ラベルは行時間です。

出力 B には、入力 A の行のグループごとに 1 つの行があります。B が table または timetable の場合、B は以下をもちます。

  • func が適用された入力 table 変数に対応する変数

  • グループ化変数に対応する変数

  • 各グループ内の入力 A の行数を値とする新しい変数 GroupCount

B が timetable の場合、B は以下ももちます。

  • 行時間。A の各行グループの最初の行時間が、B の対応する行時間です。B を行時間のない table として返すには、OutputFormat"table" として指定します。

例: B = varfun(func,A,GroupingVariables="Var3") は、AVar3 という名前の変数をグループ化変数として使用します。

例: B = varfun(func,A,GroupingVariables=["Var3","Var4"]) は、AVar3 および Var4 という名前の変数をグループ化変数として使用します。

例: B = varfun(func,A,GroupingVariables=[3 4]) は、A の 3 番目および 4 番目の変数をグループ化変数として使用します。

B の形式。次の表のいずれかの値として指定します。

"auto" (既定) (R2023a 以降)

varfun は、入力 A のデータ型に一致するデータ型をもつ出力を返します。

"table"

varfun は、A の変数ごと (または InputVariables で指定された変数ごと) に 1 つの変数を含む table を返します。グループ化された計算の場合、B にはグループ化変数および新しい変数 GroupCount も含まれます。

"table" では、A の異なる変数に対して、異なるサイズまたはデータ型の値を返す関数を使用できます。ただし、グループ化解除された計算の場合、func は呼び出されるたびに同じ行数の配列を返さなければなりません。グループ化された計算の場合、func は指定されたグループに対して呼び出されるたびに、同じ行数の配列を返さなければなりません。

A が table の場合、この形式が既定の出力形式です。

"timetable"

varfun は、A の変数ごと (または InputVariables で指定された変数ごと) に 1 つの変数を含む timetable を返します。グループ化された計算の場合、B にはグループ化変数および新しい変数 GroupCount も含まれます。

varfun は、A の行時間から B の行時間を作成します。B に割り当てられた行時間が func を使用して実行される計算のコンテキストにおいて意味を成さない場合、OutputFormat"table" として指定します。

A が timetable の場合、この形式が既定の出力形式です。

"uniform"

varfun は、出力値をベクトルに連結します。func は、呼び出されるたびに同じデータ型をもつスカラーを返さなければなりません。

"cell"

varfun は、cell 配列を返します。"cell" では、異なるサイズまたはデータ型の値を返す関数を使用できます。

例: B = varfun(func,A,OutputFormat="uniform") は、出力をベクトルとして返します。

func が失敗した場合に呼び出す関数。関数ハンドルとして指定します。func がエラーをスローした場合、ErrorHandler で指定されたエラー ハンドラー関数がエラーをキャッチし、その関数に指定されたアクションを実行します。エラー ハンドラーはエラーをスローするか、または func と同じ出力数を返さなければなりません。

ErrorHandler を指定しない場合、varfunfunc からキャッチしたエラーを再スローします。

エラー ハンドラーの最初の入力引数は、次のフィールドをもつ構造体です。

  • cause — エラーについての情報を含む MException オブジェクト (R2024a 以降)

  • index — エラーが発生した変数のインデックス

  • name — エラーが発生した変数の名前

エラー ハンドラーの残りの入力引数は、func がエラーをスローした原因である func の呼び出しの入力引数です。

たとえば、func が出力引数として 2 つの double を返すとします。エラー ハンドラーとして、警告を発行して 2 つの出力引数を返す関数を指定できます。

function [A,B] = errorFunc(S,varargin)
    warning(S.cause.identifier,S.cause.message);
    A = NaN;
    B = NaN;
end

R2024a より前のリリースでは、エラー ハンドラーの最初の入力引数は次のフィールドをもつ構造体です。

  • identifier — エラー識別子

  • message — エラー メッセージ テキスト

  • index — エラーが発生した変数のインデックス

  • name — エラーが発生した変数の名前

例: B = varfun(func,A,ErrorHandler=@errorFunc) は、errorFunc をエラー ハンドラーとして指定します。

出力引数

すべて折りたたむ

出力値。table、timetable、cell 配列、またはベクトルとして返されます。

B が table または timetable の場合、説明、変数の単位、変数名、行名などのメタデータを格納できます。詳細については、table または timetable のプロパティの節を参照してください。

B を cell 配列またはベクトルとして返すには、名前と値の引数 OutputFormat を指定します。

詳細

すべて折りたたむ

データ グループに対する計算

データ解析では、データ グループに対して計算を実行するのが一般的です。このような計算では、1 つ以上のデータ変数をデータ グループに分割し、各グループに対して計算を実行し、結果を 1 つ以上の出力変数に結合します。1 つ以上の "グループ化変数" を使用してグループを指定できます。グループ化変数の一意の値は、データ変数の対応する値が属するグループを定義します。

たとえばこの図は、6 行 1 列の数値ベクトルを 2 つのデータ グループに分け、各グループの平均を計算し、その出力を 2 行 1 列の数値ベクトルにまとめる単純なグループ化計算を示しています。6 行 1 列のグループ化変数には、ABXYZ の 2 つの一意の値があります。

Calculation that splits a data variable based on a grouping variable, performs calculations on individual groups of data by applying the same function, and then concatenates the outputs of those function calls

数値、テキスト、日時、カテゴリ、またはビンをもつグループ化変数を指定できます。

拡張機能

スレッドベースの環境
MATLAB® の backgroundPool を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool を使用してコードを高速化します。

バージョン履歴

R2013b で導入

すべて展開する