根据data.table中列的最大值自定义dcast内部的聚合函数?

Posted

技术标签:

【中文标题】根据data.table中列的最大值自定义dcast内部的聚合函数?【英文标题】:Customise the aggregate function inside dcast based on the max value of a column in data.table? 【发布时间】:2019-09-13 10:35:18 【问题描述】:

我有一个 data.table,我想基于三列(V1、V2、V3)进行 dcast。但是,V3 中有一些重复项,我需要一个聚合函数来查看第四列 V4,并根据 V4 的最大值决定 V3 的值。我想这样做,而不必在 dcasting 之前单独聚合 DT。这种聚合可以在 dcast 的聚合函数中完成,还是我需要先单独聚合表?

这是我的 data.table DT:

> DT <- data.table(V1 = c('a','a','a','b','b','c')
                 , V2 = c(1,2,1,1,2,1)
                 , V3 = c('st', 'cc', 'B', 'st','st','cc')
                 , V4 = c(0,0,1,0,1,1))
> DT
   V1 V2 V3 V4
1:  a  1 st  0
2:  a  2 cc  0
3:  a  1  B  1 ## --> i want this row to be picked in dcast when V1 = a and V2 = 1 because V4 is largest
4:  b  1 st  0
5:  b  2 st  1
6:  c  1 cc  1

dcast 函数可能如下所示:

> dcast(DT
          , V1 ~ V2
          , value.var = "V3"
         #, fun.aggregate = V3[max.which(V4)] ## ?!?!?!??!
        )

我想要的输出是:

> desired
   V1  1    2
1:  a  B   cc  
2:  b st   st
3:  c cc <NA>

请注意,在 dcast 之前聚合 DT 以消除重复项将解决此问题。我只是想知道是否可以对重复项进行 dcasting。

【问题讨论】:

您想仅使用data.table::dcast 解决此问题吗?或者您愿意接受其他选择? 我对其他选项持开放态度,只要解决方案尽可能快(处理大型数据集) 【参考方案1】:

dplyr/tidyr 选项将是 group_by V1V2 选择每个组中的最大值,然后将 spread 选择为宽格式。

library(dplyr)
library(tidyr)

DT %>%
  group_by(V1, V2) %>%
  slice(which.max(V4)) %>%
  select(-V4) %>%
  spread(V2, V3)


#   V1    `1`   `2`  
#  <chr> <chr> <chr>
#1   a     B     cc   
#2   b     st    st   
#3   c     cc    NA   

【讨论】:

啊,有趣。我想知道这是否会比 dcast 更快。 我也不确定,你可以在你的数据集上测试一下。 dcast with ordering 似乎更快。【参考方案2】:

这是一种选择,您可以在 dcasting 之前获取相关子集:

DT[order(V4, decreasing = TRUE)
   ][, dcast(unique(.SD, by = c("V1", "V2")), V1 ~ V2, value.var = "V3")] 

#    V1  1    2
# 1:  a  B   cc
# 2:  b st   st
# 3:  c cc <NA>

或者在dcast() 中订购和使用自定义函数:

dcast(
  DT[order(V4, decreasing = TRUE)], 
  V1 ~ V2, 
  value.var = "V3", 
  fun.aggregate = function(x) x[1]
)

【讨论】:

我明白了。我猜排序会比聚合更快,所以部分解决了我的问题。如果我想使用 dcast,这可能是最好的,谢谢!

以上是关于根据data.table中列的最大值自定义dcast内部的聚合函数?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Spark(Java)中列的自定义处理

如何为与python中列的最大值对应的多索引的每个级别返回索引

按 BigQuery 中列段的最大值返回列名

与 data.table 合并数据以重复唯一值

如何选择数据表中列的最小值和最大值?

报告pyspark数据框中列的前3个最大值[重复]