使用data.table制作汇总表

时间:2016-04-18 20:54:24

标签: r data.table summary

工作数据如下:

df <- data.table(Name = c("a","a","b","b","b","c","c"),
             SPP = c("YP","YP","YP","BY","BY","CY","YP"),
             Con = sample(1:20,7))
df
   Name SPP Con
1:    a  YP  18
2:    a  YP   4
3:    b  YP   2
4:    b  BY  15
5:    b  BY  17
6:    c  CY   1
7:    c  YP  20

目标是汇总SPPName分组的信息。理想的输出应该如下:

   Name SPP N V1
1:    a  YP 2  1
2:    b  YP 1  2
3:    b  BY 2  2
4:    c  CY 1  2
5:    c  YP 1  2

其中N是每个SPP组中每个Name的观察次数。 V1是每个SPP组中Name类型的总数。例如,在上面的摘要表中,第2行和第3行显示: b Name)有1 YP 和2 BY SPP)。 b 中的总SPP类型为2(V1)。

我可以通过以下方式生成摘要表:

m1 <- df[, .(.N), by = .(Name, SPP)]
m2 <- df[,.(length(unique(SPP))), by = Name]
merge(m1,m2,by = c("Name"))

问题是我是否可以使用更简洁的data.table命令生成此摘要表而不使用merge两个表?我试过像:

m1 <- df[, .(.N, length(unique(SPP))), by = .(Name, SPP)]

它无法正常工作。我不知道为什么。有人可以帮我解释一下吗?谢谢!

1 个答案:

答案 0 :(得分:4)

这有效,但在我看来,使用嵌套聚合太复杂了:

df[, c(.SD[, .N, by=SPP], n_SPP = uniqueN(SPP)), by=Name]
# or 
df[, {z = .SD[, .N, by=SPP]; c(z, n_SPP = nrow(z))}, by=Name]

另一种选择是顺序聚合:

df[, .N, by=.(Name, SPP)][, n_SPP := .N, by=Name][]