2013-08-29 49 views
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和任务= = j,prod(x);
  2. 当id ==我和任务!= j,prod(y);
  3. 当id ==我,prod(y)。

then k = prod(x)* prod(y)/(1- prod(y))。这个方程中的第一个产品(y)来自条件2,第二个产品(y)来自条件3.

作为一个例子,假设我想计算k [1](意味着id == 1,任务== 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]也表示id == 1和task == 1的条件,所以k [2] = k [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)不起作用?有人可以帮我吗?

+2

你能澄清你正在做什么计算?给一些描述你最终结果的伪代码会很有帮助。 如果我正确解释你的问题,你的目标是计算:foreach id和任务组合:计算prod(x为这个id和任务组合)* prod(y为这个id,但不是这个任务)/(1 - Prod(y为这个id))。 这是正确的吗? – leif

+0

是的!你是对的!这就是我想要做的。此计算以列数据结束,以便每个ID和任务组合具有唯一的计算值。 – Chen

回答

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的产品通过ID和任务组合,以及y.by.id包含y的产品通过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(因为没有行在数据中是这样的)。

希望有帮助!

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的产品,所以我相信这会起作用。这是从我的记忆,因为我离开我的'scrapboard'在另一个位置:

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)])) 
+0

非常感谢你的努力。但它仍然不适合我。我编辑了原始问题,并试图使其更清楚。你能再看一遍吗? Thx一百万。 – Chen