WebHU - Programozási kérdések és válaszok

Konvertálja az azonos sorrendű mátrixok listáját tömbbé

Van egy listám (100 tagból), amelynek minden tagja egy 4*2-es mátrix. Hogyan lehet ezt a listát 400*2-es dimenziós tömbbé alakítani anélkül, hogy az R-ben hurkot használna?

Például

A<-list()


A[[1]] 
        x         y
    85.56384 27.97745
    85.58448 28.02133
    85.60252 27.96366
    85.62318 28.00753

és így tovább és végül

A[[100]]
         x         y
     85.58448 28.02133
     85.60500 28.06502
     85.62317 28.00754
     85.64372 28.05122

Azt akarom, hogy A-

      x         y
    85.56384 27.97745
    85.58448 28.02133
    85.60252 27.96366
    85.62318 28.00753
         :        :
    85.58448 28.02133
    85.60500 28.06502
    85.62317 28.00754
    85.64372 28.05122

Köszönöm a segítséget.

05.02.2015

  • Adjon hozzá reprodukáló példát. 05.02.2015
  • a Lista konvertálásának lehetséges másolata mátrixhoz hatékonyabban R?-ban 05.02.2015
  • rbindlist a data.table csomagból vagy unnest a tidyr csomagból javasolnám. Vessen egy pillantást például ide 05.02.2015
  • @Pascal Köszönöm a figyelmet. Tudna javasolni, hogyan módosítsa a válaszkódot (az említett linken található), amellyel megoldható a problémám? Ez a vektorok listájával foglalkozik, és nem terjeszkedik közvetlenül bármilyen sorrendű mátrixok esetére. 05.02.2015
  • @DavidArenburg: A javaslataid nagyszerűek data.frame objektumok listájához, de nem működnek olyan jól a matrix objektumok listájához. A data.frame-ra való átalakítás tovább tart, mint a rbind. 05.02.2015
  • @shadow valószínűleg igazad van, nem mátrixokon teszteltem. 05.02.2015

Válaszok:


1

Íme egy benchmark teszt a javasolt különböző stratégiákhoz. Nyugodtan frissítse, ha új ötletei / stratégiái vannak.

# packages
require(data.table)
require(tidyr)
require(microbenchmark)

# data
lst <- replicate(100, matrix(rnorm(16), ncol = 4), simplify = FALSE)
# benchmark test
microbenchmark(
  do.call(rbind, lst), 
  Reduce(rbind, lst), 
  apply(simplify2array(lst), 2, rbind), 
  rbindlist(lapply(lst, data.frame)), 
  unnest(lapply(lst, data.frame))
  )

És az eredmények:

Unit: microseconds
                                 expr       min         lq        mean     median        uq       max neval  
                  do.call(rbind, lst)    43.290    47.9760    55.63858    52.8845    62.703   101.307   100  
                   Reduce(rbind, lst)   542.236   570.7985   620.99652   585.3020   610.518  1871.272   100  
 apply(simplify2array(lst), 2, rbind)   311.061   345.2010   382.22978   368.6315   388.268  1563.782   100  
   rbindlist(lapply(lst, data.frame)) 11827.884 12472.3190 13092.57937 12823.0995 13595.841 15833.736   100   
      unnest(lapply(lst, data.frame)) 12371.905 12927.9765 13514.24261 13236.1360 14008.655 16121.143   100  

Csak kíváncsiságból elvégeztem ezeket a benchmark teszteket a data.frame bemenetekre is, és ott nagyon más a kép:

# packages
require(data.table)
require(tidyr)
require(microbenchmark)
# data
lst <- replicate(100, as.data.frame(matrix(rnorm(16), ncol = 4)), simplify=FALSE)
# benchmark test
microbenchmark(
  do.call(rbind, lst), 
  Reduce(rbind, lst), 
  apply(simplify2array(lapply(lst, as.matrix)), 2, rbind), 
  rbindlist(lst), 
  unnest(lst)
)

eredményekkel:

Unit: microseconds
                                                    expr       min         lq       mean    median        uq        max neval 
                                     do.call(rbind, lst) 12406.716 12944.2660 13746.8552 13571.966 14564.056  16333.128   100    
                                      Reduce(rbind, lst) 36316.866 38450.7765 39894.9806 39299.610 40325.395 100949.158   100    
 apply(simplify2array(lapply(lst, as.matrix)), 2, rbind)  9577.717  9940.9930 10273.8674 10065.059 10291.996  12114.846   100    
                                          rbindlist(lst)   324.896   369.0770   397.7828   402.995   426.202    500.732   100  
                                             unnest(lst)   926.487   974.9095  1011.7322  1010.834  1033.596   1171.051   100 
05.02.2015

2

Használhatja a Reduce:

> lst=list(matrix(1:16, ncol=4), matrix(4:23, ncol=4))
[[1]]
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16

[[2]]
     [,1] [,2] [,3] [,4]
[1,]    4    9   14   19
[2,]    5   10   15   20
[3,]    6   11   16   21
[4,]    7   12   17   22
[5,]    8   13   18   23

> Reduce(rbind, lst)
      [,1] [,2] [,3] [,4]
 [1,]    1    5    9   13
 [2,]    2    6   10   14
 [3,]    3    7   11   15
 [4,]    4    8   12   16
 [5,]    4    9   14   19
 [6,]    5   10   15   20
 [7,]    6   11   16   21
 [8,]    7   12   17   22
 [9,]    8   13   18   23

@Roland javaslata szerint kerüld a Reduce-t :)

#> lst=lapply(1:100000, function(u) m+u)
#> system.time(do.call(rbind, lst))
#   user  system elapsed 
#   0.37    0.01    0.39 
#> system.time(Reduce(rbind, lst))
#   user  system elapsed 
# 704.94   38.66  743.96 
05.02.2015
  • do.call(rbind, lst) hatékonyabbnak kell lennie. 05.02.2015
  • Meg tudná magyarázni, miért hatékonyabb, mint a Reduce? (Bízom benned :) de szeretném tudni az okát) 05.02.2015
  • Reduce rbind n-1 alkalommal hívna, do.call csak egyszer. Nem benchmarkoltam, de azt várom, hogy az utóbbi hatékonyabb lesz. 05.02.2015
  • igaz, nagyon nem hatékony. És ahogy @David mondta, az rbindlist valóban jobb! 05.02.2015
  • Köszönöm a választ. 05.02.2015
  • @Roland Köszönöm a javaslatodat. 05.02.2015

  • 3

    #A legegyszerűbb megoldás

    lst <- replicate(100, matrix(rnorm(16), ncol=4), simplify=FALSE)
    
    mat_array <- do.call(rbind, lst) #this is the answer
    
    ra<-simplify2array(lst) #collection of matrices in an array
    
    dim(ra)
    
    #[1]   4   4 100
    

    Súgó a simplify2array-hez

    05.06.2021
  • Ez egy 400 vektorból álló listát ad vissza, mindegyik 4 hosszúságú. Az OP nem ezt kéri. 07.06.2021
  • Valójában 100 mátrixot hozott létre 4:4 arányban. De a fenti módosított válasz a kérdésre irányult. Köszönöm, hogy jelezted. 08.06.2021
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..