2013-02-20 11 views
9

Próbuję powiązać pewne elementy Sub elementów z listyJak uniknąć zmiany nazwy wierszy podczas używania rbind wewnątrz do.call?

Lista OC jest następujący

> library(quantmod) 
> OC <- getOptionChain('AAPL', NULL) 

> str(OC) 
List of 9 
$ Feb 2013:List of 3 
    ..$ calls :'data.frame': 35 obs. of 7 variables: 
    .. ..$ Strike: num [1:35] 380 390 400 410 420 430 440 445 450 455 ... 
    .. ..$ Last : num [1:35] 89.9 86 60 49.5 39.8 ... 
    .. ..$ Chg : num [1:35] 0 0 -0.4 -4.4 -0.7 -1.9 -0.55 -0.7 -0.95 -1 ... 
    .. ..$ Bid : num [1:35] 79.5 69.8 59.8 49.8 39.6 ... 
    .. ..$ Ask : num [1:35] 80.2 70.2 60.2 50.2 40.2 ... 
    .. ..$ Vol : num [1:35] 1 1 48 11 61 ... 
    .. ..$ OI : num [1:35] 2 2 55 29 41 ... 
    ..$ puts :'data.frame': 40 obs. of 7 variables: 
    .. ..$ Strike: num [1:40] 380 385 390 395 400 405 410 415 420 425 ... 
    .. ..$ Last : num [1:40] 0.01 0.05 0.07 0.08 0.03 0.04 0.02 0.04 0.06 0.06 ... 
    .. ..$ Chg : num [1:40] -0.03 0 0 0 -0.08 -0.06 -0.1 -0.08 -0.11 -0.17 ... 
    .. ..$ Bid : num [1:40] NA 0.01 NA NA 0.02 0.01 0.01 0.04 0.05 0.06 ... 
    .. ..$ Ask : num [1:40] 0.01 0.02 0.03 0.03 0.03 0.04 0.06 0.06 0.07 0.09 ... 
    .. ..$ Vol : num [1:40] 15 122 1 117 186 ... 
    .. ..$ OI : num [1:40] 120 99 638 95 1319 ... 
    ..$ symbol: chr "AAPL" 
$ Mar 2013:List of 3 
    ..$ calls :'data.frame': 221 obs. of 7 variables: 
    .. ..$ Strike: num [1:221] 255 265 
##.............truncated manually for post........... 

robie podstawowe rbind z wszystkimi puts dataframe wewnątrz każdego elementu listy z OC,

> allputs <- do.call('rbind', lapply(OC, FUN = function(x) x$puts)) 
> head(allputs) 
          Strike Last Chg Bid Ask Vol OI 
Feb 2013.AAPL130222P00380000 380 0.01 -0.03 NA 0.01 15 120 
Feb 2013.AAPL130222P00385000 385 0.05 0.00 0.01 0.02 122 99 
Feb 2013.AAPL130222P00390000 390 0.07 0.00 NA 0.03 1 638 
Feb 2013.AAPL130222P00395000 395 0.08 0.00 NA 0.03 117 95 
Feb 2013.AAPL130222P00400000 400 0.03 -0.08 0.02 0.03 186 1319 
Feb 2013.AAPL130222P00405000 405 0.04 -0.06 0.01 0.04 1 76 

jednak każdy rowname dostaje poprzedzany z nazwą tego elementu rodzica. Czy istnieje sposób, aby tego uniknąć?

Próbowałem ustawienie deparse.level = 0 dla rbind, ale wynik nie jest to, co chcę ..

> allputs <- do.call('rbind', list(lapply(OC, FUN = function(x) x$puts), deparse.level=0)) 
> head(allputs) 
    Feb 2013 Mar 2013 Apr 2013 May 2013 Jun 2013 Jul 2013 Oct 2013 Jan 2014 Jan 2015 
[1,] List,7 List,7 List,7 List,7 List,7 List,7 List,7 List,7 List,7 

> str(allputs[1]) 
List of 1 
$ :'data.frame': 40 obs. of 7 variables: 
    ..$ Strike: num [1:40] 380 385 390 395 400 405 410 415 420 425 ... 
    ..$ Last : num [1:40] 0.01 0.05 0.07 0.08 0.03 0.04 0.02 0.04 0.06 0.06 ... 
    ..$ Chg : num [1:40] -0.03 0 0 0 -0.08 -0.06 -0.1 -0.08 -0.11 -0.17 ... 
    ..$ Bid : num [1:40] NA 0.01 NA NA 0.02 0.01 0.01 0.04 0.05 0.06 ... 
    ..$ Ask : num [1:40] 0.01 0.02 0.03 0.03 0.03 0.04 0.06 0.06 0.07 0.09 ... 
    ..$ Vol : num [1:40] 15 122 1 117 186 ... 
    ..$ OI : num [1:40] 120 99 638 95 1319 ... 
> str(allputs[2]) 
List of 1 
$ :'data.frame': 207 obs. of 7 variables: 
    ..$ Strike: num [1:207] 255 260 265 270 275 280 285 290 295 300 ... 
    ..$ Last : num [1:207] 0.08 0.03 0.06 0.01 0.03 0.1 0.02 0.02 0.05 0.02 ... 
    ..$ Chg : num [1:207] 0 0.02 0 0 0 0 0 0 0 0 ... 
    ..$ Bid : num [1:207] NA NA NA NA NA NA NA NA NA NA ... 
    ..$ Ask : num [1:207] 0.02 0.01 0.02 0.02 0.02 0.02 0.02 0.03 0.03 0.03 ... 
    ..$ Vol : num [1:207] 5 30 5 10 3 6 1 10 5 2 ... 
    ..$ OI : num [1:207] 33 668 541 512 455 ... 
+0

Sposobem na zrobienie tego w bazie R jest "nienazwanie" listy, którą przekazujesz do 'rbind':' do.call ('rbind', unname (lapply (OC, FUN = funkcja (x) x $ puts))) ' – Zelazny7

Odpowiedz

11

Można uniknąć do.call(rbind,...) za pomocą data.table::rbindlist.

To zwróci data.table. data.tables nie masz rownames.

Jest również oślepiająco szybki!

library(data.table) 
allputs <- rbindlist(lapply(OC, FUN = function(x) x$puts)) 
# my eyes, I'm blinded! 

Jeśli chcesz dołączyć oryginalne rownames jak kolumny następnie

lputs <- lapply(OC, FUN = function(x) x$puts) 


allputs <- rbindlist(lputs) 
# add the column with rownames 
allputs[,rn := unlist(lapply(lputs, rownames))] 

Jeśli nie chcesz, aby przejść do data.tables, następnie można ustawić nazwy rodzica na NULL

names(lputs) <- NULL 

do.call('rbind', lputs) 
+0

zastrzeżenie tutaj jest to, że' rbindlist' 'alr eady oczekuje, że każdy element będzie jednolitą listą, data.frame lub data.table'. czy istnieje sposób użycia parametru 'args'' do.call' do przekazania 'rbind' a' row.names = F' lub czegoś? – d8aninja

Powiązane problemy