我要解决的问题很简单:我有一个像下面这个表格的数据表,我试图使用dcast.data.table
函数来计算每个组的晋升人数,并且我还想计算每个组成绩的中位数:
set.seed(10);
DT = data.table(GROUP = sample(c("a","b","c"),100,replace = T),
ADVANCED = sample(c("ADVANCED","DROP"),100,replace = T),
GRADE = sample(1:10,100, replace=T))
GROUP ADVANCED GRADE
1: b ADVANCED 3
2: a ADVANCED 6
3: b ADVANCED 7
4: c ADVANCED 9
95: b DROP 6
96: c ADVANCED 5
97: a DROP 10
98: b ADVANCED 1
99: c DROP 6
100: a DROP 2
GROUP ADVANCED GRADE
我需要的结果基本上是这样的:
result = merge(
dcast.data.table(DT,.Primitive("~")(GROUP,ADVANCED)),
dcast.data.table(DT,.Primitive("~")(GROUP,.),
value.var="GRADE",
fun.aggregate=median));
setnames(result,".","MEDIAN_GRADE")
GROUP ADVANCED DROP MEDIAN_GRADE
1: a 17 19 6
2: b 20 21 7
3: c 13 10 6
现在我想知道如何在不制作两张单独的dcast表并在最后合并它们的情况下完成。我的表格中有许多行和列,按键分组是一个瓶颈。我想知道是否有更好的方法来计算这个问题?
**由于我的第一个问题比较模糊,我已经完全修改了它(感谢Frank和Akrun的反馈)。
set.seed
。 - Frankreshape2::dcast(DT, GROUP ~ ADVANCED, margins="ADVANCED")
,但你将无法使用data.table::dcast
中的改进。看起来margins
从未被实现:https://github.com/Rdatatable/data.table/issues/1214 - Frank~
的rhs
在两个dcast
中是不同的,因此无法在单个dcast
中完成。我发布了一个带有on
的选项。 - akrunon
而不是merge
让我的代码快了30%。 :) - Mahdi Jadaliha