0

データ フレームに次の構造があるとします。

x=c(1:18)
y=c(9:26)
k=c(NA)
id=c(1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3)
task=c(1,1,2,2,2,3,3,1,1,1,2,2,2,1,1,2,2,2)
alts=c(2,3,1,2,3,1,3,1,2,3,1,2,3,1,2,1,2,3)

data<-data.frame(id, task, alts, x, y, k)

ここで、x と y を異なる条件で乗算します。つまり、

  1. id==i かつ task==j の場合、prod(x);
  2. id==i および task!=j の場合、prod(y);
  3. id==i の場合、prod(y)。

k=prod(x)*prod(y)/(1-prod(y))。この式の最初の prod(y) は条件 2 から得られ、2 番目の prod(y) は条件 3 から得られます。

例として、k[1] (id==1 および task==1 を意味する) を計算したい場合、k[1]=(x[1] * x[2]) * (y[3] * y[4] * y[5] * y[6] * y[7]) / (1 - y[1] * y[2] * ... * y[7])。k[2]=k[1] データ内の k[2] は、id==1 および task==1 の条件も表すためです。

私が使用するコードは次のとおりです。

for (i in 1:3){ # for each individual

  for(j in 1:3){ # for each task of each individual

    data1=ddply(data, .(id, task), transform, k=prod(x[id==i & task==j])*prod(y[id==i & task!=j])/(1-prod(y[id==i])))
  }
}

このコードを試しましたが、うまくいきませんでした。関数prod(x-condition 1)*prod(y-condition 2)/prod(y-condition 3)が機能しないのはなぜですか? 誰でも私を助けることができますか?

4

2 に答える 2

0

わかりました、@leif のコメントに基づいて、これを試してみましょう。データフレームに新しい要素を作成します。

data$calc<- data$x*(data$id==ii & data$task==jj) * data$y*(data$id==ii & data$task!=jj)/ (1-(data$y*(data$id==ii)))

さて、サンプル データの場合、これはほぼ常にゼロになります。が空のベクトルをprod(x)返すという事実を利用したかったのではないでしょうか? 1私の計算はxまたはyゼロに設定されるため、次のように変更する必要があります

data$calc<- max(1,data$x*(data$id==ii & data$task==jj)) * max(1,data$y*(data$id==ii & data$task!=jj))/ (1-(max(1,data$y*(data$id==ii))))

もちろん、データセットに負の数がある場合、これは不幸なことです。

編集: i,j 基準を満たすすべての x の積を取りたいと書いたので、これでうまくいくと思います。「スクラップボード」を別の場所に置いたので、記憶からです。

data$calc<- prod(data$x[data$id==ii & data$task==jj)]) * prod(data$y[(data$id==ii & data$task!=jj)])/ (1-prod(data$y[(data$id==ii)]) )
于 2013-08-29T20:12:14.977 に答える
0

これを部分的に行うのが最も明確かもしれないと思います。各製品を個別に計算してから、それらを組み合わせることができます。これは計算上最適ではありませんが、非常に読みやすいことを願っています。サンプル データ セットを入力として使用します。

x=c(1:18)
y=c(9:26)
k=c(NA)
id=c(1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3)
task=c(1,1,2,2,2,3,3,1,1,1,2,2,2,1,1,2,2,2)
alts=c(2,3,1,2,3,1,3,1,2,3,1,2,3,1,2,1,2,3)

data<-data.frame(id, task, alts, x, y, k)

ここで紹介する方法は、 、 、 を別々に計算prod(x by id and task)prod(y by id and task)prod(y by id)最後にそれらを結合することです。

x.y.by.id.task <- aggregate(data.frame(x.id.task=data$x, y.id.task=data$y),
                            data[c("id", "task")], 
                            prod)
y.by.id      <- aggregate(data.frame(y.id=data$y), 
                          data["id"], 
                          prod)

x.y.by.id.taskid とタスクの組み合わせによる x と yの積と、id による y の積が含まれるようになりましy.by.idた。これらを 1 つのデータ フレームに結合し、1 つのベクトル化された操作で最終的な計算を行うことができます。

id.task <- merge(x.y.by.id.task, y.by.id)

id.task$result <- 
  id.task$x.id.task * # prod(x by id by task)
  (id.task$y.id / id.task$y.id.task) / # prod(y by id and !task)
  (1 - id.task$y.id) # 1 - prod(y by id)

現在、大規模なデータセットでは、このアプローチは計算上最適ではなく、問題の設定によっては数値が不安定になる可能性があります。しかし、多くの問題設定ではこれで十分です。R が ID とタスクの組み合わせを見つけて出力を整理するという面倒な作業を行うため、このソリューションは優れています。

また、これはデータ セットに存在する ID とタスクの組み合わせの値のみを計算します。あなたの場合、id=3、task=3 の組み合わせはありません。最終的な id.task data.frame を調べると、id=3 および task=3 の行がないことがわかります (これはデータに true である行がなかったためです)。

それが役立つことを願っています!

于 2013-08-30T04:29:19.267 に答える