2017-10-04 1 views
0

Ich versuche, eine Excel wie Pivot-Tabelle UI mit Shiny zu bauen, wobei Benutzer mehrere Felder als Zeilenköpfe und ein Feld als Spaltenüberschrift wählen können. Ich verwende dcast, um eine Pivot-Tabelle zu erstellen und die endgültige Ausgabe in der Shiny-App anzuzeigen. Das Problem, mit dem ich konfrontiert bin, ist, dass wie verwende ich dcast, wenn ich nicht weiß, wie viele Spalten der Benutzer auswählen wird (da Mehrfachauswahl zulässig ist)?Wie benutze ich dcast mit dynamischer Anzahl von Spalten in LHS in R

Grundsätzlich möchte ich so etwas haben:

dcast (data_table, Column1 + Spalte2 + ... + ColumnN ~ ColumnsX, fun.aggregate = Summe, value.var = ColumnZ)

wo , Spalte1, ..., SpalteN, SpaltenX, SpalteZ sind alle vom Benutzer ausgewählten Spalten. Die Liste der ausgewählten Spalten ist in einem Vektor der Zeichenkette zur Verfügung sagen: input_list = c („Column1“, „Column2“, ..., „ColumnN“)

ich alternative Lösungen für diese auch offen bin Problem ohne Verwendung von DSC.

Vielen Dank im Voraus.

Antwort

1

Wenn Sie die Formelschnittstelle verwenden, ist es praktisch zu wissen, dass Sie sie auch als Textzeichenfolge angeben können.

dt <- data.frame(y = c(1,2,3), x1 = c(1,2,3), x2 = c(1,2,3)) 

Sorry für das Unsinn Beispiel, aber es bringt den Punkt über.

Hier ist die einfache Form:

dcast(dt, y ~ x1 + x2) 

Jetzt liefern wir es in Textform mit as.formula:

dcast(dt, as.formula("y ~ x1 + x2")) 

Und hier gehen wir noch weiter, es vollständig dynamisch basierend auf Variablennamen machen:

dcast(dt, as.formula(paste("y ~", paste(grep("^x", colnames(dt), value = T), collapse = "+")))) 

Alle drei bieten identische Ausgabe.

Und in Ihrem Fall der glänzenden App, erhalten Sie wahrscheinlich den Vektor der Namen durch eine Auswahlmethode in der Benutzeroberfläche zur Verfügung gestellt. In diesem Fall würde es in etwa so aussehen:

server <- function(input, output){ 
    output$sometable <- renderTable({ 
     dcast(dt, as.formula(paste("y ~", paste(input$someselectionmethod, collapse = "+")))) 
    } 
} 
+0

Vielen Dank für Ihre Antwort. Während die zweite Option für mich funktioniert, kann ich die 3. Option weiter verbessern, wenn meine Spaltennamen kein Muster haben? –

+0

Nun, Sie müssen die Liste der Namen von irgendwo bekommen. Entweder von einem anderen Objekt, oder von einem Muster, oder durch externe Datei .. oder irgendetwas wirklich. Es kann nicht nur eine Liste von Namen erraten, Sie müssen die Logik bereitstellen. –

Verwandte Themen