の異種行に関数を適用しますが、私はいくつかの(非ベクトル化)機能foo
があるとします。data.frame
foo <- function (bar, baz, frobozz, frotz = 42) {
if (frobozz) {
frotz
}
else {
bar * nchar(baz)
}
}
それは愚かな機能は、間違いなくだが、この質問の目的のために、与えられたように取る。 (IOW、foo
を変更することを前提回答が範囲外である。)
また、以下に示すように、私は、data.frame
df
を持っていると仮定する:
> df
frobozz bar baz
1 TRUE 1 a
2 FALSE 2 b
3 TRUE 3 c
4 FALSE 4 d
5 TRUE 5 e
次に、df
の各行はみなすことができます異種名義リスト(以下、というレコードと略記します)。
実際に、そのようなレコードとしてdf
の行のいずれかをキャストすることは困難ではない。
> df[1, , drop = TRUE]
$frobozz
[1] TRUE
$bar
[1] 1
$baz
[1] "a"
また、その名前のスロットのいずれかのために、このようなレコードの値は、のような適切なタイプのものです同じ名前の引数はfoo
の署名にあります。
これは私がdf
のいずれか単一行にfoo
を適用するためにdo.call
を使用できることを意味します(これもdf
の順序付けの列とfoo
の順序 "かかわらず動作することに注意してください
> do.call(foo, df[1, , drop = TRUE])
[1] 42
> do.call(foo, df[2, , drop = TRUE])
[1] 2
必要な引数が一致しません)
foo
ににすべての行のを適用して新しい列を作成します。
私はapply
は、タスクまでだろうと期待していたが、それは失敗します。もちろん
> apply(df, 1, foo)
Error in FUN(newX[, i], ...) :
argument "frobozz" is missing, with no default
、私はこのような何かに頼ることができます:
sapply(1:nrow(df), function (i) { do.call(foo, df[i, , drop = TRUE]) })
が少ない無知ありこれを達成するための見通しの方法?
ここでは、より扱いやすいかもしれないこの質問の変形です。それは必要なすべての引数、record
は、bar
という名前の要素、baz
、およびfrobozz
を持っているということですので
foo_wrapper <- function (record) {
foo(record$bar, record$baz, record$frobozz)
}
この機能、foo
よりも柔軟である;:
は機能foo_wrapper
を考えてみましょうそれが持つかもしれない他の要素については気にしません。また、1はdo.call
に頼らずに、df
の行に直接foo_wrapper
を適用することができます。
> foo_wrapper(df[4, , drop = TRUE])
[1] 4
残念ながら、apply
も同様foo_wrapper
で失敗します。
> apply(df, 1, foo_wrapper)
Error in record$frobozz : $ operator is invalid for atomic vectors
参照を '実行できますか?mapply'。 'do.call(mapply、c(foo、df))'を試してください。 – nicola
[this](http://stackoverflow.com/questions/10078211/use-multiple-columns-as-variables-with-sapply)が役立つかもしれないと思います。 '?mapply'またはそのラッパー'?Vectorize' - 'do.call(Vectorize(foo)、df)' –
@ Hack-R 'baz'カラムは' foo'の順に文字でなければなりません。 – nicola