2013-08-29 64 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