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