2016-09-02 8 views
1

Zunächst einmal vielen Dank für das Lesen meiner Post.Wie kann ich R Subset-Mechanismus in Excel VBA replizieren?

Ich möchte fragen, wie kann ich R Subset-Mechanismus in replizieren?

Hier ist meine Funktion:

Subdeck2 = deck2[(deck2[,3]>=10 & deck2[,4]<=30),] 

Der Code verwendet ein data.frame Objekt zu erstellen Subdeck2 genannt, die eine Teilmenge eines data.frame Objekt genannt deck2, die die Zeilen von deck2 enthalten, die eine dritte Spalte Wert haben von mehr als oder gleich zehn und ein vierter Spaltenwert von weniger als oder gleich dreißig.

Ich möchte dies in replizieren, und ein Arbeitsblatt, das eine Teilmenge eines Arbeitsblattes mit den Quelldaten ist. Ich denke, die Array-Benennung in ist sehr hilfreich, um die Zeilen und Spalten zu verweisen.

In wird es verwirrend, wenn ich dies wiederholt tun muss, weil ich mich an die Zeilen- und Spaltennummern erinnern muss, die ich bereits eingegeben habe.

Ich muss nur dieses eine Ding in tun. Ich habe bereits ein Buch über Programmierung gekauft, aber es ist wie 1000 Seiten lang und ich kann nicht scheinen, das Wort Teilmenge dort zu finden.

Irgendwelche Vorschläge, wie dies zu tun ist oder wo ich lernen kann, dies zu tun, wird sehr geschätzt. Vielen Dank!

+0

Als Nebenwirkung, in der Regel in R Sie müssen nicht auf Zeilen- oder Spaltennummern verlassen Dinge wie dies zu tun. Zum Beispiel kann dieser Code leicht mit Spaltennamen wie 'deck2 [deck2 $ c> = 10 & deck2 $ d <= 30,] 'oder als' subset (deck2, c> = 10 & d <= 30)' geschrieben werden wenn die 3. und 4. Spalte "c" und "d" heißen. – Axeman

+0

wow yeah du hast recht, danke, dass du mich informiert hast. aber ich muss immer noch die Zeilen- und Spaltennummer verwenden. Weil er echte Funktion, die ich wirklich verwenden werde ist, dass ich einen bestimmten Wert in einem Datenrahmen verwenden werde – AndrePH

+0

wow ja du hast recht, danke, dass Sie mich wissen lassen. aber ich muss immer noch die Zeilen- und Spaltennummer verwenden. Weil die reale Funktion, die ich wirklich verwenden werde, einen bestimmten Wert in einem Datenrahmen als bedingten Wert verwenden wird. weil ich das mehr als 200 Mal machen muss. Also muss ich den bedingten Wert zuerst in einem Array eingeben, so dass ich den bedingten Wert nicht jedes Mal eingeben muss. Die reale Funktion wird wie Deck2 sein [Deck2 $ c> = Quartil $ A [1,3] & Deck2 $ d <= Quartil $ B [1,3],] und so weiter. Wie auch immer, danke für die Eingabe, ich habe es geschätzt. – AndrePH

Antwort

2

Hier ist ein Beispiel - nicht so knapp wie Ihre Funktion.

Die Methode ist kommentiert - aber im Grunde iteriert sie die Zeilen des Quellbereichs und überprüft jede Zeile auf die Kriterien. Dann wählt es den Ausgabebereich aus und ändert seine Größe auf die Größe der gefilterten Daten vor der Ausgabe.

Option Explicit 

Sub FilterLikeRSubset() 

    Dim rngData As Range 
    Dim rngRow As Range 
    Dim rngFilter As Range 
    Dim rngOutput As Range 

    'get data 
    Set rngData = ThisWorkbook.Worksheets("Sheet1").Range("A1:D5") 

    'iterate rows in data 
    For Each rngRow In rngData.Rows 
     'test row criteria 
     If rngRow.Cells(1, 3) >= 10 And rngRow.Cells(1, 4) <= 30 Then 
      'success 
      If rngFilter Is Nothing Then 
       Set rngFilter = rngRow 
      Else 
       Set rngFilter = Union(rngFilter, rngRow) 
      End If 
     End If 
    Next rngRow 

    'set range for output 
    Set rngOutput = ThisWorkbook.Worksheets("Sheet1").Range("A10") 
    Set rngOutput = rngOutput.Resize(rngFilter.Rows.Count, rngFilter.Columns.Count) 

    'output 
    rngOutput.Value = rngFilter.Value 

End Sub 

Beispielausgabe:

enter image description here

+0

Nun, ich denke, das ist was ich brauche, ich werde es gleich ausprobieren. Vielen Dank für Ihren Beitrag, ich schätze es sehr. Wie auch immer, weißt du ein besonders gutes Buch, das ich lesen kann, um mehr über VBA zu erfahren? nicht die, die viele Seiten haben, ich bevorzuge 400 bis 500 Seiten Tops. Eine letzte Sache, wie bedankst du dich in diesem Forum? Ich bin ein bisschen neu dazu er. – AndrePH

+0

Gern geschehen. Sie können den Upvote-Button neben der Antwort verwenden und wenn der Code für Sie funktioniert, können Sie den Tick-Button unter dem Voting-Button verwenden, um anzuzeigen, dass die Antwort Ihre Frage gelöst hat. –

+0

Ja, dieser Code ist wirklich nah an dem, was ich im Sinn habe, aber gibt es trotzdem, dass wir den bedingten Wert auf eine Union eines benannten Arrays in Excel verweisen können? zum Beispiel in Ihrem Code ist wie 'If rngRow.Cells (1, 3)> =" Row3_ Column2_ "Und rngRow.Cells (1, 4) <=" dreißig "Dann'? – AndrePH