根据 data.table 中某列的最大值自定义 dcast 中的聚合函数?
Customise the aggregate function inside dcast based on the max value of a column in data.table?
我有一个 data.table,我想基于三列(V1、V2、V3)进行 dcast。但是,V3 中有一些重复项,我需要一个聚合函数来查看第四列 V4 并根据 V4 的最大值决定 V3 的值。我想这样做而不必在 dcasting 之前单独聚合 DT。这个聚合可以在 dcast 的聚合函数中完成,还是我需要先单独聚合 table?
这是我的 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。
dplyr
/tidyr
选项将是 group_by
V1
和 V2
select 每个组中的最大值然后 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
或:
之前获取相关子集
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]
)
我有一个 data.table,我想基于三列(V1、V2、V3)进行 dcast。但是,V3 中有一些重复项,我需要一个聚合函数来查看第四列 V4 并根据 V4 的最大值决定 V3 的值。我想这样做而不必在 dcasting 之前单独聚合 DT。这个聚合可以在 dcast 的聚合函数中完成,还是我需要先单独聚合 table?
这是我的 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。
dplyr
/tidyr
选项将是 group_by
V1
和 V2
select 每个组中的最大值然后 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
或:
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]
)