2014-02-13 16 views
18

Ich habe ein Problem mit mutate{dplyr} Funktion mit dem Ziel, eine neue Spalte zu Datenrahmen hinzufügen. Ich möchte, dass eine neue Spalte vom Typ Zeichen ist und aus "concat" von sortierten Wörtern aus anderen Spalten besteht (die ebenfalls zeichenartig sind). Zum Beispiel für die folgenden Datenrahmen:dplyr muate in R - Spalte als Concat der Spalten hinzufügen

> library(datasets) 
> states.df <- data.frame(name = as.character(state.name), 
+       region = as.character(state.region), 
+       division = as.character(state.division)) 
> 
> head(states.df, 3) 
    name region   division 
1 Alabama South East South Central 
2 Alaska West   Pacific 
3 Arizona West   Mountain 

Ich möchte eine neue Spalte mit der folgenden ersten Element erhalten:

"Alamaba_East South Central_South" 

habe ich versucht, dieses:

mutate(states.df, 
    concated_column = paste0(sort(name, region, division), collapse="_")) 

Aber ich Fehler:

Error in sort(1:50, c(2L, 4L, 4L, 2L, 4L, 4L, 1L, 2L, 2L, 2L, 4L, 4L, : 
    'decreasing' must be a length-1 logical vector. 
Did you intend to set 'partial'? 

Vielen Dank für Ihre Hilfe im Voraus!

Antwort

20

Sie müssen sep = nicht collapse = verwenden, und warum verwenden Sie sort?. Und ich benutzte paste und nicht paste0.

library(dplyr) 
states.df <- data.frame(name = as.character(state.name), 
         region = as.character(state.region), 
         division = as.character(state.division)) 
res = mutate(states.df, 
    concated_column = paste(name, region, division, sep = '_')) 

Soweit die Sortierung geht, Sie sort nicht korrekt verwenden. Vielleicht möchten Sie:

as.data.frame(lapply(states.df, sort)) 

Diese sortiert jede Spalte, und erstellt eine neue data.frame mit diesen Spalten.

+0

Danke Paul für Ihr Interesse! Ich folgte Ihren Vorschlägen und es funktioniert mit Ihrem Code, aber wenn ich versuche, * die Wörter zu sortieren (ich meine: 'einfügen (Sortieren (Name, Region, Division), sep = '_'))) es nicht . (Der gleiche Fehler wie oben in meiner Beschreibung). –

+0

Sie müssen die Dokumentation von 'sort' sorgfältig lesen,' sort' nimmt einen Vektor als Eingabe und gibt die sortierte Version zurück. Sie füttern es drei Vektoren, die nicht wie Sie sortieren sollten. Was willst du genau machen? –

+0

Och, ok, ich verstehe (danke für diese Erklärung!). In meinem realen Fall habe ich einen Datensatz mit 3 Spalten. Die 3 Spalten stehen für 3 Aktionen, die aus einem * Set * von Aktionen stammen. Ich kümmere mich nicht mehr um die Reihenfolge, in der diese 3 Aktionen ausgeführt wurden, also wollte ich sie in eine Variable umwandeln - der Wert dieser Variablen würde die Namen dieser 3 Aktionen enthalten und "Sortierung" sollte nicht auf die Reihenfolge achten . –

2

Hinzufügen zu Pauls Antwort. Wenn Sie die Zeilen sortieren möchten, können Sie versuchen order. Hier ein Beispiel:

res1 <- mutate(states.df, 
      concated_column = apply(states.df[order(name, region, division), ], 1, 
            function(x) paste0(x, collapse = "_"))) 

hier, um die data.frame states.df nach Namen sortiert und dann bricht die Bindung nach Region und Division

+0

Ich habe diese 'apply' verwendet Antwort, damit muate Zeilen nach Variablennamen einfügen kann! Vielen Dank, dass Sie mich auf den richtigen Weg gebracht haben! 'muate (tbl, var = anwenden (. [, c ('varA', 'varB')], 1, Funktion (x) einfügen (x, collapse =" ")))' –

Verwandte Themen