Настроить функцию агрегирования внутри dcast на основе максимального значения столбца в data.table? - PullRequest
1 голос
/ 24 апреля 2019

У меня есть data.table, который я хотел бы сделать dcast на основе трех столбцов (V1, V2, V3).однако в V3 есть некоторые дубликаты, и мне нужна агрегатная функция, которая просматривает четвертый столбец V4 и определяет значение V3 на основе максимального значения V4.Я хотел бы сделать это без необходимости отдельно агрегировать DT до dcasting.Можно ли выполнить это агрегирование в функции агрегирования 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>

Обратите внимание, что объединение DT перед dcasting, чтобы избавиться от дубликатов, решит проблему.Мне просто интересно, можно ли сделать дкастинг с дубликатами.

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Вот один вариант, в котором вы берете подходящее подмножество перед 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>

Можно также заказать и использовать пользовательскую функцию в dcast():

dcast(
  DT[order(V4, decreasing = TRUE)], 
  V1 ~ V2, 
  value.var = "V3", 
  fun.aggregate = function(x) x[1]
)
0 голосов
/ 24 апреля 2019
Параметр

dplyr / tidyr может быть group_by V1, а V2 - выбрать максимальное значение в каждой группе, а затем 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   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...