1. ホーム
  2. r

[解決済み] データフレームの各行に対して、各行からの複数の引数でapplyのような関数を呼び出す

2022-04-15 13:52:58

質問

複数の列を持つデータフレームがあります。 データフレーム内の各行について、その行の関数を呼び出したいのですが、関数の入力にはその行から複数の列が使用されます。 例えば、このデータと、2つの引数を受け取るtestFuncがあるとします。

> df <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6))
> df
  x y z
1 1 3 5
2 2 4 6
> testFunc <- function(a, b) a + b

このtestFuncをx列とz列に適用したいとします。つまり、1行目には1+5、2行目には2+6が欲しいということです。 forループを書かずに、apply関数ファミリーを用いてこれを行う方法はありますか?

こんなことをやってみました。

> df[,c('x','z')]
  x z
1 1 5
2 2 6
> lapply(df[,c('x','z')], testFunc)
Error in a + b : 'b' is missing

しかし、エラーが発生した、何かアイデアは?

EDITです。 実際に呼び出したい関数は、単純な合計ではなく、power.t.testです。 a+bは例として使っただけです。 最終的な目標はこのようなことができるようになることです(疑似コードで書かれています)。

df = data.frame(
    delta=c(delta_values), 
    power=c(power_values), 
    sig.level=c(sig.level_values)
)

lapply(df, power.t.test(delta_from_each_row_of_df, 
                        power_from_each_row_of_df, 
                        sig.level_from_each_row_of_df
))

ここで、結果はdfの各行に対するpower.t.testの出力のベクトルです。

どのように解決するのですか?

を適用することができます。 apply を元データの部分集合に適用する。

 dat <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6))
 apply(dat[,c('x','z')], 1, function(x) sum(x) )

または、関数が単に合計であれば、ベクトル化されたバージョンを使用します。

rowSums(dat[,c('x','z')])
[1] 6 8

を使いたい場合は testFunc

 testFunc <- function(a, b) a + b
 apply(dat[,c('x','z')], 1, function(x) testFunc(x[1],x[2]))

EDIT インデックスではなく名前でカラムにアクセスするには、次のような方法があります。

 testFunc <- function(a, b) a + b
 apply(dat[,c('x','z')], 1, function(y) testFunc(y['z'],y['x']))