2015-05-26 33 views
0

我在CSV得到這個表/數組:R:在陣列重量參數基於其他參數

 
GroupID Channel Daysbeforelast 
1   A 35 
1   B 31 
1   C 29 
1   D 17 
1   E 15 
1   D 5 
1   C 0 
2   B 66 
2   E 17 
2   D 15 
2   A 2 
2   C 0 
2   F 0 
2   A 0 
4   B 15 
4   C 0 

,並試圖增加一個列Weight所以表看起來就像這樣:

 
GroupID Channel Daysbeforelast  Weight How it is calculated 
1   A   35   0.00005   (1-x/2/2-x/2-x)/2 
1   B   31   0.00005   (1-x/2/2-x/2-x)/2 
1   C   29   0.0833   (x/2/2)/3 
1   D   17   0.0833   (x/2/2)/3 
1   E   15   0.0833   (x/2/2)/3 
1   D   5   0.25   (x/2) 
1   C   0   0.5    (x) 
2   B   66   0.125   (1-x/2/2-x/2-x) 
2   E   17   0.0625   (x/2/2)/2 
2   D   15   0.0625   (x/2/2)/2 
2   A   2   0.25   (x/2) 
2   C   0   0.25   (x)/3 
2   F   0   0.25   (x)/3 
2   A   0   0.5    (x)/3 
4   B   15   0.5    (1-x) 
4   C   0   0.5    (x) 

下面解釋。

每個組可以具有一個或多個亞組取決於數據:

如果Daysbeforelast=0然後Subgroup1;

If 0<Daysbeforelast<=7 then Subgroup2;

If 7<Daysbeforelast<=14 then Subgroup3;

If 14<Daysbeforelast<=30 then Subgroup4;

Else Subgroup5。第一小組有weight = x(例如x = 0.5)。此weight均勻分佈在組中的所有行中。可以說組Y在SubgroupZ中有3行。在這種情況下,每行將有weight equal (SubgroupZ weight)/3

子組2具有weight = x/2,它以相同的方式分佈在該子組中的所有行上。

每個子組直到最後一個人將收到weight等於先前的羣由2 最後亞組中劃分weight(並不總是小組5)將獲得該組中的所有先前的權重weight = 1 - sum。 這是爲了檢查每組的權重總和是否等於1.

請注意,如果我們例如在Subgroup2中沒有任何行,則Subgroup3將收到weight x/2(而不是x/2/2)。 我們有所有組的Subgroup1,但所有或任何其他子組都可能會丟失。

使用變量lapply也許最簡單的方式,但我得到了它棧我是很新的R.

此外,我想爲R中的重量分佈有可能是專門的庫/函數?

感謝您查看我的問題。

回答

2

以下是解決方案:對於每個組,使用cut確定子組並使用droplevels刪除缺席子組。將權重分配爲(x/2^n)/freq。然後,找出最小權重和調整它們的權重,使得總和組中添加高達1

dat <- read.table("clipboard", header = T) 
groupIDs <- unique(dat$GroupID) 
x = 0.5 
for (i in groupIDs) 
{ 
    rows = which(dat$GroupID == i) 
    Subgroups <- cut(dat[rows,3], c(-Inf,0,7,14,30,Inf), labels = 1:5) 
    a<-droplevels(Subgroups) 
    wts <- sapply(a,function(y)(x/(2^(as.numeric(y)-1)))/(table(a)[which(levels(a) == y)])) 

    ind <- wts==min(wts) 
    wts[ind] <- (1-sum(wts[!ind]))/sum(ind) 
    dat[rows,4] <- wts  
} 
names(dat)[4] <- "Weight" 
+0

非常感謝@Omley!它工作得很好,這是很好的解決方案。我已更正'如何計算權重'列。 – user912830823