工作数据如下:
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
目标是汇总SPP
按Name
分组的信息。理想的输出应该如下:
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)]
它无法正常工作。我不知道为什么。有人可以帮我解释一下吗?谢谢!
答案 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][]