Воссоздать dplyr суммировать в data.table - PullRequest
0 голосов
/ 09 июля 2019

Просто из любопытства, есть ли способ воссоздать вывод summary, используя data.table вместо dplyr?

dt1 <- data.table(
  uid=c("A00111", "A00112","A00113","A00211","A00212","A00213","A00214","A00311","A00312"),
  area=c("A001", "A001","A001","A002","A002","A002","A002","A003","A003"),
  price=c(325147,NA,596020,257409,241206,248371,261076,595218,596678),
  type=c("Type1","Type2","Type3","Type2","Type3","Type2","Type2","Type2","Type3"))

summary <- dt1 %>% group_by(area) %>% summarise(
    Total_Number = length(uid),
    Total_Number_Check = unique(length(uid)),
    Number_of_Type_1 = length(uid[type=="Type1"]),
    Mean_Price_Type_1 = mean(price[type=="Type1"],na.rm = TRUE),
    Number_of_Type_2 = length(uid[type=="Type2"]),
    Mean_Price_Type_2 = mean(price[type=="Type2"],na.rm = TRUE),
    Number_of_Type_3 = length(uid[type=="Type3"]),
    Mean_Price_Type_3 = mean(price[type=="Type3"],na.rm = TRUE))    

1 Ответ

2 голосов
/ 09 июля 2019

Вот ход с data.table

Комментарий @DavidArenburg выше - это способ суммировать по умолчанию с data.table.

Однако я не создал сводку за один раз, поскольку у вас может быть более 3 type -вариантов. Если это так, было бы нереально подвести итог (вручную)> 10 типов. Это стало бы длинным (скучным) кодом.

Итак, я сначала суммировал по области (DT1), а затем снова суммировал по области И по типу. Затем преобразовал результат второго резюме в широкоформатный формат (DT2) и соединил DT2 слева в DT1.

Таким образом, приведенный ниже код будет работать для любого количества областей и любого количества типов.

library( data.table )
#summarise by area
DT1 <- dt1[ , .( Total_Number = .N, 
                 Total_Number_Check = uniqueN( uid ) ), 
            by = .(area)]
#summarise by area AND type and cast to wide format
DT2 <- dcast( dt1[ , .( Number_of = .N, 
                        Mean_Price = mean( price, na.rm = TRUE ) ), 
                   by = .(area, type)], 
              area ~ type, 
              value.var = c("Number_of", "Mean_Price") )
#join
DT1[DT2, on = .(area)]

#    area Total_Number Total_Number_Check Number_of_Type1 Number_of_Type2 Number_of_Type3 Mean_Price_Type1
# 1: A001            3                  3               1               1               1            325147
# 2: A002            4                  4              NA               3               1                NA
# 3: A003            2                  2              NA               1               1                NA
# Mean_Price_Type2 Mean_Price_Type3
# 1:                NA            596020
# 2:          255618.7            241206
# 3:          595218.0            596678
...