r - 有效地组合几个 dcast data.table(共享相同的 key )

标签 r data.table dcast

这是我要解决的简单问题:我有一个如下表所示的 data.table,我正在尝试使用 dcast.data.table 函数来计算进度对于每个组,但我也有兴趣计算每个组中的 median 成绩:

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 的反馈)。

最佳答案

对于更新的问题

setnames(dcast(DT, GROUP~ADVANCED, length)[dcast(DT, GROUP~., median),
            on = "GROUP"], ".", "MEDIAN_GRADE")[]
#   GROUP ADVANCED DROP MEDIAN_GRADE
#1:     a       17   19            6
#2:     b       20   21            7
#3:     c       13   10            6

或者更快的方法是按“GROUP”分组,得到 median 'GRADE' 然后加入 on dcast输出

DT[,.(MEDIAN_GRADE = median(GRADE)) , .(GROUP)][
              dcast(DT, GROUP ~ ADVANCED, length), on = 'GROUP']

关于r - 有效地组合几个 dcast data.table(共享相同的 key ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38881401/

相关文章:

r - 最后一个下划线后分隔字符串

r - 使用 R 中的条件将行拆分为列

r - 从文本中提取名词和动词

找不到JAVA renjin函数

r - 如何 unnest_wider() 循环遍历包含列表的所有列?

在r中重新编码数据

r - 使用对预先存在的向量的引用创建 data.table

r - 以奇怪的方式应用 dcast

r - 将长表转换为仅包含一列计数的宽格式

r - 如何同时绘制单条趋势线和多条趋势线?