2016-03-22 6 views
1

В моей рабочей области у меня есть dfo, который представляет собой список из 216 объектов. Каждый объект представляет собой кадр данных, первые два объекта показаны:lapply over list of Data Frames (R)

> head(dfo) 
$`1997-01-23` 
     Date C/P K  Vol  Delta  ID 
56 1997-01-23 0 400  NA  NA 11690674 
10 1997-01-23 0 550  NA  NA 10376194 
34 1997-01-23 0 600  NA  NA 11036690 
58 1997-01-23 0 650  NA  NA 11544898 
27 1997-01-23 0 660  NA  NA 10759732 
52 1997-01-23 0 670  NA  NA 11439157 
50 1997-01-23 0 680 0.176301 0.995920 11364929 
60 1997-01-23 0 690 0.185490 0.99
39 1997-01-23 0 700 0.203161 0.972175 11183860 
65 1997-01-23 0 710 0.200024 0.955090 11730364 
38 1997-01-23 0 720 0.202629 0.923953 10982863 
. .   . . .   .  . 
. .   . . .   .  . 
. .   . . .   .  . 
45 1997-01-23 1 785 0.160904 -0.552771 10986679 
2 1997-01-23 1 790 0.159603 -0.609276 10333499 
23 1997-01-23 1 795 0.156346 -0.666208 10456682 
47 1997-01-23 1 800 0.154266 -0.719749 11072475 
44 1997-01-23 1 805 0.150034 -0.773075 11165557 
63 1997-01-23 1 810 0.151855 -0.812170 11764824 
53 1997-01-23 1 815 0.150437 -0.851131 11378977 
62 1997-01-23 1 820  NA  NA 11532248 
18 1997-01-23 1 825  NA  NA 10428721 
41 1997-01-23 1 830  NA  NA 10985583 

$`1997-02-20` 
      Date C/P K  Vol  Delta  ID 
125 1997-02-20 0 400  NA  NA 11116217 
139 1997-02-20 0 450  NA  NA 11285261 
157 1997-02-20 0 475  NA  NA 11697618 
100 1997-02-20 0 500  NA  NA 10744183 
167 1997-02-20 0 525  NA  NA 11659969 
162 1997-02-20 0 550  NA  NA 11774819 
79 1997-02-20 0 575  NA  NA 10237388 
150 1997-02-20 0 600  NA  NA 11441546 
118 1997-02-20 0 610  NA  NA 10875377 
72 1997-02-20 0 620  NA  NA 10249544 
121 1997-02-20 0 625  NA  NA 10924970 
85 1997-02-20 0 630  NA  NA 10387622 
102 1997-02-20 0 635  NA  NA 10599759 
107 1997-02-20 0 640  NA  NA 10770025 
124 1997-02-20 0 645  NA  NA 11068359 
129 1997-02-20 0 650  NA  NA 10883922 
105 1997-02-20 0 660  NA  NA 10485716 
123 1997-02-20 0 670  NA  NA 11020541 
175 1997-02-20 0 675 0.244968 0.994066 10350962 
98 1997-02-20 0 680 0.261206 0.989390 10574981 
. .   . . .   .  . 
. .   . . .   .  . 
. .   . . .   .  . 
99 1997-02-20 1 830 0.182276 -0.719366 10719331 
163 1997-02-20 1 840 0.178969 -0.797619 11657641 
132 1997-02-20 1 850 0.178679 -0.858147 11205448 
169 1997-02-20 1 875  NA  NA 11759335 
67 1997-02-20 1 900  NA  NA 10001169 
90 1997-02-20 1 925  NA  NA 10196550 

У меня также есть кадр данных index из 216 строк и 2 колонки:

> head(index) 
     Date Index 
1 01/23/1997 776.64 
2 02/20/1997 800.35 
3 03/20/1997 778.04 
4 04/17/1997 760.49 
5 05/22/1997 833.86 
6 06/19/1997 888.99 

Для каждого кадра данных в списке dfo I хотите разделить вектор dfo$K на соответствующее значение index$Index для этой даты. 216 дат в списке кадров данных и 216 дат в фрейме данных index прекрасно соответствуют, но я включил столбцы Date как в dfo, так и index для резервирования.

Как бы реализовать в этом случае lapply? Я действительно не понимаю, как связать список из 216 кадров данных с фреймом данных из 216 строк.

+1

Возможно, вы захотите взглянуть на 'mapply'. – coffeinjunky

+2

Учитывая, что ваш список data.frames, похоже, имеет одинаковые столбцы и уже имеет столбец «Date», который отличает данные, вы можете просто объединить их все в один большой data.frame с помощью 'do.call (rbind, dfo) ', если вам проще работать, поэтому вы можете использовать' merge' или 'dplyr' или whatnot. Если вы хотите изменить все как можно меньше, тем не менее, 'mapply' или' Map' - это путь. – alistaire

+1

Если ваши таблицы в списке имеют одинаковую структуру, будет менее эффективно обрабатывать их с помощью обработки 'lapply' по сравнению с одной таблицей * по группе *. Для быстрого связывания вашего списка в единый набор данных смотрите функцию 'rbindlist'. – jangorecki

ответ

1

Рассмотрите возможность итерации по каждому объекту списка кадров данных и слияние с index кадром данных на дату. Затем в цикле запустите ваш расчет K/Index, держите Index или нет, а затем верните результат.

newdfList <- lapply(dfList, function(df) {        
         newdf <- merge(ind, df, by='Date') 
         newdf['K'] <- newdf['K']/newdf['Index']        
         newdf['Index'] <- NULL 
         return(newdf) 
        })