2016-08-08 14 views
3

Ich arbeite mit 3D-Arrays. Eine Funktion nimmt eine 2D-Array-Slice (Matrix) vom Benutzer und visualisiert sie unter Verwendung von Zeilen- und Spaltennamen (die entsprechenden Dim-Namen des Arrays). Es funktioniert gut, wenn die Array-Dimensionen sind> 1.Wie extrahiere ich 1x1 Array Slice als Matrix in R?

Wenn jedoch I 1x1x1 Array, Ich kann die Scheibe als Matrix extrahieren:

a <- array(1, c(1,1,1), list(A="a", B="b", C="c")) 

a[1,,] 
[1] 1 

Es ist ein Skalar ohne dimnames somit Teil die notwendigen Informationen fehlen. Wenn ich drop=FALSE hinzufügen, bekomme ich nicht eine Matrix, aber das ursprüngliche Array behalten:

a[1,,,drop=FALSE] 
, , C = c 

    B 
A b 
    a 1 

Die dimnames sind hier, aber es ist immer noch 3-dimensional. Gibt es eine einfache Möglichkeit, eine Matrix Scheibe von 1x1x1-Array zu erhalten, wie die oben genannten, nur ohne die dritte Dimension aussehen:

B 
A b 
    a 1 

Ich vermute, dass das Problem ist, dass, wenn ein Array indizieren, können wir nicht unterscheiden zwischen ‚nehmen 1-Wert‘und‚alle Werte annehmen‘in Fall, in dem‚alle‘nur ein Singleton ist ...

Antwort

6

der drop Parameter von [ ist alles oder nichts, aber das abind Paket hat eine adrop Funktion, die Sie im Stich lässt Wählen Sie, welche Dimension Sie ablegen möchten:

abind::adrop(a, drop = 3) 
## B 
## A b 
## a 1 
+0

Whoa, die dieses Downvoted? Es ist eine gute Antwort! – thelatemail

+0

Das ist genau das, was ich gesucht habe :-) –

+0

@thelatemail Es ist die dritte ungerade für mich in den letzten zwei Tagen. Ich denke, jemand versucht, das Serien-Downvote-Skript nicht zu bemerken. Keine Ahnung warum, obwohl; Ich war meistens eine Woche weg. – alistaire

4

ohne zusätzliche Pakete, die beste, die ich war zu apply und senden Sie das Sub-Array tun könnte:

apply(a, 1:2, identity) 
# or 
apply(a, 1:2, I) 

# B 
#A b 
# a 1