使用 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][]
工作数据如下:
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][]