R:在 data.table 中聚合并重用变量
R: aggregate in data.table and reuse variable
我有一个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
可以吗?谢谢
我猜你想要 .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.
我有一个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
可以吗?谢谢
我猜你想要 .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.