webentwicklung-frage-antwort-db.com.de

dplyr mutieren in R - Spalte als Konkat von Spalten hinzufügen

Ich habe ein Problem mit der Verwendung von mutate{dplyr} mit dem Ziel, dem Datenrahmen eine neue Spalte hinzuzufügen. Ich möchte, dass eine neue Spalte vom Zeichentyp ist und aus "concat" von sortierten Wörtern aus anderen Spalten (die ebenfalls vom Zeichentyp sind) besteht. Zum Beispiel für den folgenden Datenrahmen:

> 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 dem folgenden ersten Element erhalten:

"Alamaba_East South Central_South" 

Ich habe es versucht:

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

Aber ich habe einen Fehler erhalten:

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 jede Hilfe im Voraus!

26
Marta Karas

Sie müssen sep = nicht collapse = und warum sort verwenden ?. Und ich habe 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 = '_'))

Was die Sortierung angeht, verwenden Sie sort nicht richtig. Vielleicht möchten Sie:

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

Dies sortiert jede Spalte und erzeugt ein neues data.frame mit diesen Spalten.

28
Paul Hiemstra

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

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

Hier sortiert order die data.frame states.df nach Namen und unterbricht die Zuordnung nach Region und Division

2
Ray