2016-11-11 7 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, печать всего. Я могу сделать это в ddply с использованием table и повторно использовать переменную в пределах 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' дважды! –