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

问题描述 投票:1回答:2

我有一个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>

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

r data.table customization aggregate-functions dcast
2个回答
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]
)

0
投票

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   
© www.soinside.com 2019 - 2024. All rights reserved.