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

R 根据data.table中某列的最大值自定义dcast中的聚合函数?,r,data.table,customization,aggregate-functions,dcast,R,Data.table,Customization,Aggregate Functions,Dcast,我有一个data.table,我想基于三列(V1、V2、V3)进行dcast。但是,V3中存在一些重复项,我需要一个聚合函数,它查看第四列V4并根据V4的最大值确定V3的值。我希望这样做,而不必在dcast之前单独聚合DT。这个聚合可以在dcast的聚合函数中完成,还是需要先单独聚合表 这是我的数据表DT: > DT <- data.table(V1 = c('a','a','a','b','b','c') , V2 = c(1,2,1,1,2,1)

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

这是我的数据表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
我期望的输出是:

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

请注意,在dcasting之前聚合DT以消除重复项将解决此问题。我只是想知道是否可以用复制品进行数据广播。
dplyr
/
tidyr
选项将是按
V1
V2
选择每组中的最大值,然后将
扩展到宽格式

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   
库(dplyr)
图书馆(tidyr)
DT%>%
分组依据(V1,V2)%>%
切片(哪个.max(V4))%>%
选择(-V4)%>%
排列(V2,V3)
#V1`1``2`
#    
#1 a B cc
#b街2号
#3立方厘米钠

这里有一个选项,您可以在
dcast
ing之前获取相关子集:

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>

是否仅使用
data.table::dcast
解决此问题?或者你对其他选择持开放态度?我对其他选择持开放态度,只要解决方案尽可能快(处理大型数据集)啊,很有趣。我想知道这是否会比dcast快。我也不确定,您可以在数据集上测试它,然后检查。dcast排序似乎更快。我明白了。我猜排序比聚合要快,所以部分解决了我的问题。如果我想使用dcast,这可能是最好的了,谢谢!
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(
  DT[order(V4, decreasing = TRUE)], 
  V1 ~ V2, 
  value.var = "V3", 
  fun.aggregate = function(x) x[1]
)