web-dev-qa-db-fra.com

dplyr mute dans R - ajoute une colonne en tant que concat de colonnes

J'ai un problème avec mutate{dplyr} fonction dans le but d'ajouter une nouvelle colonne au bloc de données. Je veux qu'une nouvelle colonne soit de type caractère et se compose de "concat" de mots triés à partir d'autres colonnes (qui sont également de type caractère). Par exemple, pour le bloc de données suivant:

> 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 

Je voudrais obtenir une nouvelle colonne avec le premier élément suivant:

"Alamaba_East South Central_South" 

J'ai essayé ceci:

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

Mais j'ai reçu une erreur:

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'?

Merci pour toute aide à l'avance!

26
Marta Karas

Vous devez utiliser sep = ne pas collapse =, et pourquoi utiliser sort ?. Et j'ai utilisé paste et non 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 = '_'))

En ce qui concerne le tri, vous n'utilisez pas correctement sort. Peut-être que vous voulez:

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

Cela trie chaque colonne et crée un nouveau data.frame avec ces colonnes.

28
Paul Hiemstra

Ajoutant à la réponse de Paul. Si vous souhaitez trier les lignes, vous pouvez essayer order . Voici un exemple:

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

Ici, l'ordre trie le fichier data.frame states.df par nom, puis rompt le lien par région et division

2
Ray