Как я могу ускорить функцию, объединяющую rbind и lapply? - PullRequest
0 голосов
/ 05 января 2019

У меня большой фрейм данных (100K строк, 19 столбцов). Мне нужно подсчитать количество дел в каждом месяце, которые содержат каждую возможную комбинацию из 5 предметов.

Следующий код работает для небольшого набора данных, но с моим полным набором данных это занимает слишком много времени. Из моих поисков я подозреваю, что предварительное выделение фрейма данных является ключом, но я не могу понять, как это сделать.

library(dplyr)

Case<-c(1,1,1,2,2,3,4,5,5,6,6,6,7,8,8,8,9,9,9)
Month<- c("Jan","Jan","Jan","Mar","Mar","Sep","Sep","Nov","Nov","Dec","Dec","Dec","Apr","Dec","Dec","Dec","Dec","Dec","Dec")

Fruits<-c("Apple","Orange","Grape","Grape","Orange","Apple","Apple","Orange","Grape","Apple","Orange","Grape","Grape","Apple","Orange","Grape","Apple","Orange","Grape")

df<-data.frame(Case,Month,Fruits)


Patterns <- with(df, do.call(rbind, lapply(unique(Case), function(x){
  y <- subset(df, Case == x )
  Date<-as.character(y$Month[1])
  Fruits <- paste(unique(y$Fruits[order(y$Fruits)]), collapse = ' / ') 
  as.data.frame(unique (cbind(Case = y$Case, Date, Fruits)))
})))

Total<-Patterns %>%
  group_by(Date,Fruits) %>%
  tally()

Полученные результаты приемлемы, но процесс занимает слишком много времени, и с большим набором данных у меня заканчивается память.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Для больших наборов данных data.table будет намного быстрее, чем dplyr:

library(data.table)
setDT(df)[, lapply(.SD, toString), by = c("Case","Month")][,.N, by = c("Fruits","Month")]
0 голосов
/ 05 января 2019

Мы могли бы сделать все это одной командой, используя dplyr. Сначала мы group_by Case и Month вставляем все Fruits вместе по группам, а затем группируем по Month и Fruits и добавляем количество строк для каждой группы, используя tally.

library(dplyr)
df %>%
   group_by(Case, Month) %>%
   summarise(Fruits = paste(Fruits, collapse = "/")) %>%
   group_by(Month, Fruits) %>%
   tally()
   # OR count()

#  Month Fruits                 n
#  <fct> <chr>              <int>
#1 Apr   Grape                  1
#2 Dec   Apple/Orange/Grape     3
#3 Jan   Apple/Orange/Grape     1
#4 Mar   Grape/Orange           1
#5 Nov   Orange/Grape           1
#6 Sep   Apple                  2
...