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,第二个 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空向量的事实?我的计算设置xy为零,因此必须将其修改为类似

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.task包含 x 和 y by id 和 task 组合y.by.id的乘积,并且包含 y by id 的乘积。我们可以将它们组合成一个数据帧,并使用一个矢量化操作进行最终计算。

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 的行(因为数据中没有行)。

希望有帮助!

于 2013-08-30T04:29:19.267 回答