2016-05-04 6 views
0

Dies ist mein ursprüngliches Problem, und ich kann nicht eine gute LösungVektorisierung (Array-Zugriff und Gebäude Vorkommen Tabellen) in R

kann sagen, ich habe eine große Vektor finden, die einen Faktor Variable mit K Klassen zum Beispiel enthält, (in der Praxis ein viel viel größerer Vektor) vec=c("A","B","A","D","E","C","A","B"). (Hier K = 5 ist, in der Praxis viel mehr Klassen)

I definieren die 2 Zeilenvektoren und ein Array

t=c(1,1,3,5,2) 
u=c(2,7,6,1,4) 
A=rbind(t,u) 

A, T, U-Arrays/Vektoren von Indizes

(In der Praxis bedeutet sehr viel größer ist als die, vielleicht Millionen)

so, hat eine N (= 2 in diesem Beispiel) Zeilen, und jede Zeile ist eine Beobachtung

was Ich mag würde haben, als ein Ausgang ein ist Array/Datenrahmen mit N Zeilen und K Spalten, wobei die Anzahl der Vorkommen einer jeder Klasse in dem Vektor durch die Indizes jeder Reihe erzeugten

Daher entspricht die erste Zeile einen Vektor AAAEB die erste Reihe meines neue Array sollte 3 1 0 0 1, die die Vorkommen von A, B, C, D, E


sein, so habe ich versucht, das Problem

myfunction1 <- function(v) {vec[v]} 
myfunction2 <- function(v) {table(vec[v])} 

beide

vektorisiert werden können, sich zu zersetzen 012.

zum Beispiel

> myfunction1(t) 
[1] "A" "A" "A" "E" "B" 

das ist ok

aber, hier ein erstes Problem:

> myfunction2(t) works, but skips C D which have no occurence 

A B E 
3 1 1 

dann, wenn ich

versuchen
> myfunction1(A) 
[1] "A" "B" "A" "A" "A" "C" "E" "A" "B" "D" 
> myfunction2(A) 

A B C D E 
5 2 1 1 1 

i das Ergebnis zu erhalten für das gesamte Array wird als ein einziger Vektor betrachtet ... nicht was ich wollen !!!

Wenn ich die mapply/sapply/lapply Weg zu gehen, ist es nicht einfach

im Grunde, ich eine Funktion benötigen würde, die aus einem Array einen Vektor von Listen/Listen von Listen aller Elemente in jedem schafft Zeile und gelten Sie dafür. Welche Funktion kann ich nicht finden?

Dann spüre ich, ein Problem in das richtige Format zu konvertieren zurück

Schließlich sollte ich zum ersten Mal erwähnt,

> vec[A] 
[1] "A" "B" "A" "A" "A" "C" "E" "A" "B" "D" 

gibt einen flachen Vektor nur

Dank für Ihre Hilfe danken !!!

Ich verstehe nicht, warum so eine einfache Aufgabe so schwierig zu tun scheint in R vielleicht gibt es eine eingebaute Funktion, das zu tun?

Antwort

2

Sie müssen Vec einen Faktor machen. Wenn vec ein Faktor ist, zählt die table Funktion alle Ebenen des Faktors. Hier ist eine Methode:

# make vec a factor 
vec.f=factor(c("A","B","A","D","E","C","A","B")) 

t(apply(A, 1, function(i) table(vec.f[i]))) 

Dies gilt die Lookup-Tabelle Methode vec.f[i] jede Reihe und verwendet table die Ergebnisse tabellarisch. Ich habe das Ergebnis mit t transponiert, um die gewünschte Form zu erhalten. Als zusätzlichen Vorteil erinnern Sie sich an die Namen der Ergebnisse und übernehmen diese für die Spalten- und Zeilennamen. table und apply

A vektorisiert und vielleicht einfachere Lösung, wie @alexis_laz vorgeschlagen, würde eine einzige table Funktion verwenden:

table(row(A), vec.f[A]) 

Hier verlieren Sie die Zeilennamen sowie die Reihenfolge der Reihen (table sortiert die Zeilen- und Spaltennamen alphabetisch), aber dies kann leicht behoben werden, da Sie die sortierten Zeilennamen der ursprünglichen Matrix an die Zeilennamen der Tabelle übergeben können.

+0

danke sehr, und ich wusste, sapply/lapply, aber das ist das erste Mal, dass ich sehe, wie anwenden ist nützlich !!! vielen Dank !!!! Ich war auf dem für eine lange Zeit fest –

+0

@ FaguiCurtain 'apply' ist nicht die schnellste, colMeans und Freunde sind viel schneller für ihre spezifischen Aufgaben, aber' apply' kann oft Teil einer flexiblen Lösung für die Matrix-Verarbeitung sein. – lmo

+3

In ähnlicher Weise, nach der Angabe der "Faktor", 'Tabelle (Zeile (A), vec.f [A])' –