2016-11-11 62 views
1

我有一個data.table我想總結。它看起來像:R:data.table中的聚合和重用變量

> DF 
      new_src action 
1: cdn.adnxs.com  1 
2: cdn.adnxs.com  1 
3: cdn.adnxs.com  1 
4: cdn.adnxs.com  3 
5: s1.2mdn.net  1 
6: cdn.adnxs.com  3 
7: cdn.adnxs.com  3 
8: cdn.adnxs.com  3 
9: cdn.adnxs.com  3 
10: cdn.adnxs.com  3 

我想new_src聚集,通過action發現出現頻率最高,計算頻率,打印此action,打印總量。 我可以使用tableddply中執行此操作,並重復使用ddply中的變量,因此我不需要多次運行table。 我需要在data.table中做到這一點,但我不能重用table結果,我必須運行table兩次。

例子。這工作:

DF = structure(list(new_src = c("cdn.adnxs.com", "cdn.adnxs.com", 
           "cdn.adnxs.com", "cdn.adnxs.com", "s1.2mdn.net", "cdn.adnxs.com", 
           "cdn.adnxs.com", "cdn.adnxs.com", "cdn.adnxs.com", "cdn.adnxs.com"), action = c("1", "1", "1", "3", "1", "3", "3", "3", "3", "3")), .Names = c("new_src", "action"), class = c("data.table", "data.frame"), row.names = c(NA, -10L)) 

dt = DF[1:10,by=list(new_src),list(tb = sort(table(action),decreasing=T)[1], nm = names(sort(table(action),decreasing=T)[1]),tot = .N)] 
View(dt) 

ddpl = ddply(DF,.(new_src),summarize,tb = sort(table(action),decreasing=T)[1], nm = names(tb), tot = length(new_src)) 
View(ddpl) 

這不。

dt = DF[1:10,by=list(new_src),list(tb = sort(table(action),decreasing=T)[1], nm = names(tb),tot = .N)] 

這可能與data.table?由於

回答

2

我猜你想.N這裏:

DF[, .N, by=.(new_src, action)][ 
    order(-N), .(topv = action[1], topn = N[1], n = sum(N)), by=new_src] 

     new_src topv topn n 
1: cdn.adnxs.com 3 6 9 
2: s1.2mdn.net 1 1 1 

要處理的關係,增加更多的參數order(-N, ...)


相反鏈的by=的,嵌套是另一種選擇:

DF[, .SD[, .N, by=action][order(-N), c(.SD[1], .(totn = sum(.N)))], by=new_src] 

     new_src action N totn 
1: cdn.adnxs.com  3 6 2 
2: s1.2mdn.net  1 1 1 

我發現很難效仿,雖然,它可能會更慢,因爲j = .N is optimized

+1

太棒了!非常感謝你。我的代碼的那部分運行速度快了很多,現在我不會運行'table'兩次! –