2

データ フレームに関数を適用したい。この関数は V1 を arg1 として、V2 を arg2 として取り、結果を V3 または他のベクトルに書き込みたいと考えています。

これを行う簡単でコンパクトな方法はありますか?以下に(動作しない)例を投稿しました。

ありがとう

ストゥ

my.func <- function(X, Y) {
  return(X + Y)
} 
a <- c(1,2,3)
b <- c(4,5,6)
my.df <- data.frame(a, b)
apply(my.df, 1, my.func, X="a", Y="b")
4

4 に答える 4

4

mapply()このために作られています。

次のいずれかでジョブが実行されます。2 番目のアプローチの利点は、任意の数の引数を取る関数にうまくスケーリングできることです。

mapply(my.func, my.df[,1], my.df[,2])
# [1] 5 7 9

do.call(mapply, c(FUN=list(my.func), unname(my.df)))
# [1] 5 7 9
于 2013-09-09T03:56:51.660 に答える
1

*applyここでは、関数はまったく必要ありません。ベクトル化で十分です。

my.df$c <- my.df$a + my.df$b
#  a b c
#1 1 4 5
#2 2 5 7
#3 3 6 9

名前付きベクトルを関数に渡さない applyため、ソリューションは記述したとおりに機能しません。apply

colnames(my.df)
#[1] "a" "b"

apply( my.df , 1 , colnames )
#NULL
于 2013-09-09T04:57:35.557 に答える
0

あなたの例でrowSums(my.df)は、仕事をします。より複雑なタスクについては、関数を使用できますmapply。例: mapply(my.func, my.df[a], my.df[b]).

または、ベクトル引数を取るように関数を書き直すこともできます。

my.otherfunc <- function(x) sum(x)
apply(my.df, 1, my.otherfunc)

applyが各行または列を関数にフィードするとき、個別のエントリのリストではなく、1 つのベクトルを送信していることを理解することが重要です。したがって、単一の (ベクトル) 引数を持つ関数を指定する必要があります。

于 2013-09-09T03:56:49.920 に答える