使用 data.table 进行总结 table

Using data.table to make summary table

工作数据如下:

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

目标是汇总按 Name 分组的 SPP 中的信息。理想的输出应该是这样的:

   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 是每个 Name 组中每个 SPP 的观察数。 V1 是每个 Name 组中 SPP 类型的总数。例如,在上面的摘要 table 中,第 2 行和第 3 行显示: b(Name) 有 1 YP 和 2 BY (SPP)。 b 中的总 SPP 类型为 2(V1).

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

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

问题是我是否可以在不使用 merge 两个 table 的情况下使用更简洁的 data.table 命令生成此摘要 table?我试过类似的东西:

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

效果不如预期。我不知道为什么。有人可以帮我解释一下吗?谢谢!

这可行,但在我看来太复杂了,嵌套聚合:

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][]