R заменяет `for` на` sapply` в списке списков - PullRequest
0 голосов
/ 07 февраля 2020

Существует список списка, содержащий data.frames:

names(r01)
[1] "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20"
names(r01[[1]])
[1] "rst" "df" 

names(r01[[1]][['rst']])
[1] "2017-05-08/0.50" "2017-05-08/1.00" "2017-05-08/1.50" "2017-05-08/2.00" "2017-05-08/2.50"
[6] "2017-05-08/3.00" "2017-06-09/2.00" "2017-06-09/2.50" "2017-06-09/3.00" "2017-07-10/0.50"
...
...
[91] "2019-01-14/1.00" "2019-01-14/1.50" "2019-01-14/3.00"

Каждый элемент этого последнего списка является data.frame. Это for выполняет задачу:

r01p=data.frame()
for(dias in 1:2)         #length(r01))
  for(datas in 1:2){     #length(r01[[dias]][['rst']])){
    r01t=cbind(periodo=names(r01)[dias],r01[[dias]][['rst']][[datas]])
    r01p=rbind(r01p,r01t)
}
r01p[,1:10]
   periodo dia      dt_op  rz  dt_pregao     rst  rst1 pc_rst1  vl1   rst2
1        5   1 2017-05-08 0.5 2017-05-08   193.2   990   100.0 0.33 -816.0
2        5   2 2017-05-08 0.5 2017-05-09  -218.8  -150   -15.2 0.38   68.0
3        5   3 2017-05-08 0.5 2017-05-10 -2983.2 -1380  -139.4 0.79  435.2
4        5   4 2017-05-08 0.5 2017-05-11 -3419.2 -1620  -163.6 0.87  489.6
5        5   5 2017-05-08 0.5 2017-05-12 -7746.8 -3330  -336.4 1.44  952.0
6        5   6 2017-05-08 0.5 2017-05-15      NA    NA      NA   NA 1264.8
7        5   1 2017-05-08 1.0 2017-05-08   222.8   990   100.0 0.33 -791.2
8        5   2 2017-05-08 1.0 2017-05-09  -334.8  -150   -15.2 0.38   55.2
9        5   3 2017-05-08 1.0 2017-05-10 -3183.2 -1380  -139.4 0.79  404.8
10       5   4 2017-05-08 1.0 2017-05-11 -3251.2 -1620  -163.6 0.87  496.8
11       5   5 2017-05-08 1.0 2017-05-12 -9486.0 -3330  -336.4 1.44 1012.0
12       5   6 2017-05-08 1.0 2017-05-15      NA    NA      NA   NA 1306.4
13       6   1 2017-05-05 0.5 2017-05-05   214.8   990   100.0 0.45 -809.6
14       6   2 2017-05-05 0.5 2017-05-08   599.2   264    26.7 0.33  -52.8
15       6   3 2017-05-05 0.5 2017-05-09   354.0   154    15.6 0.38    0.0
16       6   4 2017-05-05 0.5 2017-05-10 -1618.4  -748   -75.6 0.79  334.4
17       6   5 2017-05-05 0.5 2017-05-11 -1694.4  -924   -93.3 0.87  422.4
18       6   6 2017-05-05 0.5 2017-05-12 -5719.6 -2178  -220.0 1.44  915.2
19       6   7 2017-05-05 0.5 2017-05-15      NA    NA      NA   NA 1196.8
20       6   1 2017-05-05 1.0 2017-05-05   214.8   990   100.0 0.45 -809.6
21       6   2 2017-05-05 1.0 2017-05-08   599.2   264    26.7 0.33  -52.8
22       6   3 2017-05-05 1.0 2017-05-09   354.0   154    15.6 0.38    0.0
23       6   4 2017-05-05 1.0 2017-05-10 -1618.4  -748   -75.6 0.79  334.4
24       6   5 2017-05-05 1.0 2017-05-11 -1694.4  -924   -93.3 0.87  422.4
25       6   6 2017-05-05 1.0 2017-05-12 -5719.6 -2178  -220.0 1.44  915.2
26       6   7 2017-05-05 1.0 2017-05-15      NA    NA      NA   NA 1196.8

Цель состоит в том, чтобы идентифицировать (r01 имя элемента) и rbind data.frames в r01[[*all*]][['rst']].
Можно ли заменить это for sapply?

Воспроизводимый экстракт:

dput(r01)
list(`5` = list(rst = list(structure(list(dia = 1:6, dt_op = structure(c(17294, 
17294, 17294, 17294, 17294, 17294), class = "Date"), rz = c(0.5, 
0.5, 0.5, 0.5, 0.5, 0.5), dt_pregao = structure(c(17294, 17295, 
17296, 17297, 17298, 17301), class = "Date"), rst = c(193.2, 
-218.8, -2983.2, -3419.2, -7746.8, NA), rst1 = c(990, -150, -1380, 
-1620, -3330, NA), pc_rst1 = c(100, -15.2, -139.4, -163.6, -336.4, 
NA), vl1 = c(0.33, 0.38, 0.79, 0.87, 1.44, NA), rst2 = c(-816, 
68.0000000000001, 435.2, 489.6, 952, 1264.8), pc_rst2 = c(-100, 
8.3, 53.3, 60, 116.7, 155)), class = "data.frame", row.names = c(NA, 
-6L)), structure(list(dia = 1:6, dt_op = structure(c(17294, 17294, 
17294, 17294, 17294, 17294), class = "Date"), rz = c(1, 1, 1, 
1, 1, 1), dt_pregao = structure(c(17294, 17295, 17296, 17297, 
17298, 17301), class = "Date"), rst = c(222.8, -334.8, -3183.2, 
-3251.2, -9486, NA), rst1 = c(990, -150, -1380, -1620, -3330, 
NA), pc_rst1 = c(100, -15.2, -139.4, -163.6, -336.4, NA), vl1 = c(0.33, 
0.38, 0.79, 0.87, 1.44, NA), rst2 = c(-791.2, 55.2, 404.8, 496.8, 
1012, 1306.4), pc_rst2 = c(-100, 7, 51.2, 62.8, 127.9, 165.1)), class = "data.frame", row.names = c(NA, 
-6L))), df = list(structure(list(dt_op = structure(c(17294, 17294, 
17294, 17294), class = "Date"), rz = c(0.5, 0.5, 0.5, 0.5), cd_papel = c("PETRE34", 
"PETRF44", "PETRE44", "PETRQ15"), strike = c(14, 14.5, 14.5, 
15), qt = c(3000, 1360, 5680, 800), c_v = c(-1, 1, -1, 1), preco = c(0.33, 
0.6, 0.14, 0.97), at_ini = c(14.08, 14.08, 14.08, 14.08)), class = "data.frame", row.names = c("9", 
"12", "11", "121")), structure(list(dt_op = structure(c(17294, 
17294, 17294, 17294), class = "Date"), rz = c(1, 1, 1, 1), cd_papel = c("PETRE34", 
"PETRF15", "PETRE15", "PETRQ15"), strike = c(14, 15, 15, 15), 
    qt = c(3000, 1840, 16000, 800), c_v = c(-1, 1, -1, 1), preco = c(0.33, 
    0.43, 0.05, 0.97), at_ini = c(14.08, 14.08, 14.08, 14.08)), class = "data.frame", row.names = c(9L, 
14L, 13L, 12L)))), `6` = list(rst = list(structure(list(dia = 1:7, 
    dt_op = structure(c(17291, 17291, 17291, 17291, 17291, 17291, 
    17291), class = "Date"), rz = c(0.5, 0.5, 0.5, 0.5, 0.5, 
    0.5, 0.5), dt_pregao = structure(c(17291, 17294, 17295, 17296, 
    17297, 17298, 17301), class = "Date"), rst = c(214.8, 599.2, 
    354, -1618.4, -1694.4, -5719.6, NA), rst1 = c(990, 264, 154, 
    -748, -924, -2178, NA), pc_rst1 = c(100, 26.7, 15.6, -75.6, 
    -93.3, -220, NA), vl1 = c(0.45, 0.33, 0.38, 0.79, 0.87, 1.44, 
    NA), rst2 = c(-809.6, -52.8, 0, 334.4, 422.4, 915.2, 1196.8
    ), pc_rst2 = c(-100, -6.5, 0, 41.3, 52.2, 113, 147.8)), class = "data.frame", row.names = c(NA, 
-7L)), structure(list(dia = 1:7, dt_op = structure(c(17291, 17291, 
17291, 17291, 17291, 17291, 17291), class = "Date"), rz = c(1, 
1, 1, 1, 1, 1, 1), dt_pregao = structure(c(17291, 17294, 17295, 
17296, 17297, 17298, 17301), class = "Date"), rst = c(214.8, 
599.2, 354, -1618.4, -1694.4, -5719.6, NA), rst1 = c(990, 264, 
154, -748, -924, -2178, NA), pc_rst1 = c(100, 26.7, 15.6, -75.6, 
-93.3, -220, NA), vl1 = c(0.45, 0.33, 0.38, 0.79, 0.87, 1.44, 
NA), rst2 = c(-809.6, -52.8, 0, 334.4, 422.4, 915.2, 1196.8), 
    pc_rst2 = c(-100, -6.5, 0, 41.3, 52.2, 113, 147.8)), class = "data.frame", row.names = c(NA, 
-7L))), df = list(structure(list(dt_op = structure(c(17291, 17291, 
17291, 17291), class = "Date"), rz = c(0.5, 0.5, 0.5, 0.5), cd_papel = c("PETRE34", 
"PETRF15", "PETRE15", "PETRQ15"), strike = c(14, 15, 15, 15), 
    qt = c(2200, 1760, 10000, 880), c_v = c(-1, 1, -1, 1), preco = c(0.45, 
    0.46, 0.08, 0.87), at_ini = c(14.21, 14.21, 14.21, 14.21)), class = "data.frame", row.names = c("11", 
"13", "15", "111")), structure(list(dt_op = structure(c(17291, 
17291, 17291, 17291), class = "Date"), rz = c(1, 1, 1, 1), cd_papel = c("PETRE34", 
"PETRF15", "PETRE15", "PETRQ15"), strike = c(14, 15, 15, 15), 
    qt = c(2200, 1760, 10000, 880), c_v = c(-1, 1, -1, 1), preco = c(0.45, 
    0.46, 0.08, 0.87), at_ini = c(14.21, 14.21, 14.21, 14.21)), class = "data.frame", row.names = c("11", 
"13", "15", "111")))))

1 Ответ

0 голосов
/ 11 февраля 2020

Существует это решение с Reduce и lapply:

r01p=Reduce(rbind,
        lapply(names(r01),
           function(x) cbind(periodo=as.integer(x),Reduce(rbind,r01[[x]][['rst']]))))

r01p
   periodo dia      dt_op  rz  dt_pregao     rst  rst1 pc_rst1  vl1   rst2 pc_rst2
1        5   1 2017-05-08 0.5 2017-05-08   193.2   990   100.0 0.33 -816.0  -100.0
2        5   2 2017-05-08 0.5 2017-05-09  -218.8  -150   -15.2 0.38   68.0     8.3
3        5   3 2017-05-08 0.5 2017-05-10 -2983.2 -1380  -139.4 0.79  435.2    53.3
4        5   4 2017-05-08 0.5 2017-05-11 -3419.2 -1620  -163.6 0.87  489.6    60.0
5        5   5 2017-05-08 0.5 2017-05-12 -7746.8 -3330  -336.4 1.44  952.0   116.7
6        5   6 2017-05-08 0.5 2017-05-15      NA    NA      NA   NA 1264.8   155.0
7        5   1 2017-05-08 1.0 2017-05-08   222.8   990   100.0 0.33 -791.2  -100.0
8        5   2 2017-05-08 1.0 2017-05-09  -334.8  -150   -15.2 0.38   55.2     7.0
9        5   3 2017-05-08 1.0 2017-05-10 -3183.2 -1380  -139.4 0.79  404.8    51.2
10       5   4 2017-05-08 1.0 2017-05-11 -3251.2 -1620  -163.6 0.87  496.8    62.8
11       5   5 2017-05-08 1.0 2017-05-12 -9486.0 -3330  -336.4 1.44 1012.0   127.9
12       5   6 2017-05-08 1.0 2017-05-15      NA    NA      NA   NA 1306.4   165.1
13       6   1 2017-05-05 0.5 2017-05-05   214.8   990   100.0 0.45 -809.6  -100.0
14       6   2 2017-05-05 0.5 2017-05-08   599.2   264    26.7 0.33  -52.8    -6.5
15       6   3 2017-05-05 0.5 2017-05-09   354.0   154    15.6 0.38    0.0     0.0
16       6   4 2017-05-05 0.5 2017-05-10 -1618.4  -748   -75.6 0.79  334.4    41.3
17       6   5 2017-05-05 0.5 2017-05-11 -1694.4  -924   -93.3 0.87  422.4    52.2
18       6   6 2017-05-05 0.5 2017-05-12 -5719.6 -2178  -220.0 1.44  915.2   113.0
19       6   7 2017-05-05 0.5 2017-05-15      NA    NA      NA   NA 1196.8   147.8
20       6   1 2017-05-05 1.0 2017-05-05   214.8   990   100.0 0.45 -809.6  -100.0
21       6   2 2017-05-05 1.0 2017-05-08   599.2   264    26.7 0.33  -52.8    -6.5
22       6   3 2017-05-05 1.0 2017-05-09   354.0   154    15.6 0.38    0.0     0.0
23       6   4 2017-05-05 1.0 2017-05-10 -1618.4  -748   -75.6 0.79  334.4    41.3
24       6   5 2017-05-05 1.0 2017-05-11 -1694.4  -924   -93.3 0.87  422.4    52.2
25       6   6 2017-05-05 1.0 2017-05-12 -5719.6 -2178  -220.0 1.44  915.2   113.0
26       6   7 2017-05-05 1.0 2017-05-15      NA    NA  
...