Использование вложенных lapply для фильтрации по критериям и создания нескольких фреймов данных - PullRequest
0 голосов
/ 10 января 2019

вот пример моих данных с именем shipment:

shipment <- read.table(text = 'Week Org     Forecast       Actual Forecast.over..under Accuracy.. Int.Ext
24    1/22/2018 KNI      $5,095       $7,101              $(2,006)       139%    Int 
366  12/31/2018 DAN  $3,387,247   $1,907,435           $1,479,812         56%    Int ', header = T)

Я хотел бы создать список из 15 фреймов данных, отфильтрованных для всех возможных комбинаций в этих двух векторах для столбцов Org и Int.Ext соответственно.

int.ext <- c("Int","Ext","Total")
site <- c("BAL", "DAN", "LON", "STL", "WC")

Когда я запускаю приведенный ниже код, я получаю список, но единственные кадры данных, которые перечислены правильно, это те, которые имеют Int.Ext значения «Всего». Кадры данных, которые должны быть отфильтрованы для «Int» или «Ext», не содержат строк.

frames <- lapply(int.ext, function(i){ 
            lapply(site, function(j){ 
                filter(shipment, Org==j, Int.Ext==i)})
                      })

1 Ответ

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

Если вы готовы покинуть базу R, это может быть более кратким:

library(tidyr)
library(dplyr)

d <- crossing(Org = site,Int.Ext = int.ext)
semi_join(shipment,d)

Или, если вам действительно нужно разделить их на список фреймов данных, может быть,

d <- crossing(Org = site,Int.Ext = int.ext) %>% mutate(id = row_number())
inner_join(shipment,d) %>% split(x = .,f = .$id)
...