【问题标题】:R: aggregate in data.table and reuse variableR:在 data.table 中聚合并重用变量
【发布时间】:2016-11-11 16:16:42
【问题描述】:

我想总结一下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 可以吗?谢谢

【问题讨论】:

    标签: r data.table plyr


    【解决方案1】:

    我猜你想在这里.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

    【讨论】:

    • 太棒了!非常感谢你。由于我没有运行两次table,我的这部分代码运行得更快了!
    猜你喜欢
    • 2015-04-29
    • 2021-03-06
    • 1970-01-01
    • 2020-03-26
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多