2013-08-18 140 views
1

我有data.table,我需要添加额外的列,即对于相同的cID,标签== 1和标签== 2之间的比率。我有可以做到这一点的代码,但结果是根据唯一的“l”的数量减少的形式。但我需要一个完整的重复列表。有什么建议么?提前致谢!计算data.table中具有特定标签的值的比率

x y l cID 
0.03588851 0.081635056 1 1 
0.952514891 0.82677373 1 1 
0.722920691 0.687278396 1 1 
0.772207687 0.743329599 2 1 
0.682710551 0.946685728 1 2 
0.795816439 0.024320077 2 2 
0.50788885 0.106910923 2 2 
0.145871035 0.802771467 2 2 
0.092942384 0.335054397 1 3 
0.439765866 0.199329139 1 4 

重现

x = c(0.03588851,0.952514891,0.722920691,0.772207687,0.682710551,0.795816439,0.50788885,0.145871035,0.092942384,0.439765866) 
y = c(0.081635056,0.82677373,0.687278396,0.743329599,0.946685728,0.024320077,0.106910923,0.802771467,0.335054397,0.199329139) 
l = c(1,1,1,2,1,2,2,2,1,1) 
cID = c(1,1,1,1,2,2,2,2,3,4) 
dt <- data.table(x,y,l,cID) 
dt[,sum(l == 1)/sum(l == 2), by = cID] 

我需要获得比列,看起来像这样

x y l cID ratio 
0.03588851 0.081635056 1 1 3 
0.952514891 0.82677373 1 1 3 
0.722920691 0.687278396 1 1 3 
0.772207687 0.743329599 2 1 3 
0.682710551 0.946685728 1 2 0.333333333 
0.795816439 0.024320077 2 2 0.333333333 
0.50788885 0.106910923 2 2 0.333333333 
0.145871035 0.802771467 2 2 0.333333333 
0.092942384 0.335054397 1 3 Inf 
0.439765866 0.199329139 1 4 Inf 

回答

3

你是八九不离十。试试这个:

dt[, ratio := sum(l == 1)/sum(l == 2), by = cID] 
+0

YEAH!谢谢!它可以处理未分类的数据吗? –

+0

它不使用数据的顺序。它只是一个总和的比例。 –

+0

@JohnAmraph如果你的意思是,如果这些群体不在一起而是混乱起来,它仍然会工作吗?是。在这种情况下,您可以将每个组复制到一个连续的块中,例如运行“sum”或依赖于顺序的'cumsum',然后将结果放回原来组中的行。如果这是有道理的。 –