web-dev-qa-db-fra.com

Concaténer par ligne sur des colonnes spécifiques de la trame de données

J'ai un bloc de données avec des colonnes qui, lorsqu'elles sont concaténées (ligne par ligne) sous forme de chaîne, me permettraient de partitionner le bloc de données dans la forme souhaitée.

> str(data)
'data.frame':   680420 obs. of  10 variables:
 $ A              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
 $ B              : chr  "2011-01-26" "2011-01-27" "2011-02-09" "2011-02-10" ...
 $ C              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
 $ D              : chr  "AAA" "AAA" "BCB" "CCC" ...
 $ E              : chr  "A00001" "A00002" "B00002" "B00001" ...
 $ F              : int  9 9 37 37 37 37 191 191 191 191 ...
 $ G              : int  NA NA NA NA NA NA NA NA NA NA ...
 $ H              : int  4 4 4 4 4 4 4 4 4 4 ...

Pour chaque ligne, je voudrais concaténer les données des colonnes F, E, D et C dans une chaîne (avec le caractère de soulignement comme séparateur). Ci-dessous est ma tentative infructueuse de ceci:

data$id <- sapply(as.data.frame(cbind(data$F,data$E,data$D,data$C)), paste, sep="_")

Et ci-dessous est le résultat indésirable:

  > str(data)
    'data.frame':   680420 obs. of  10 variables:
     $ A              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
     $ B              : chr  "2011-01-26" "2011-01-27" "2011-02-09" "2011-02-10" ...
     $ C              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
     $ D              : chr  "AAA" "AAA" "BCB" "CCC" ...
     $ E              : chr  "A00001" "A00002" "B00002" "B00001" ...
     $ F              : int  9 9 37 37 37 37 191 191 191 191 ...
     $ G              : int  NA NA NA NA NA NA NA NA NA NA ...
     $ H              : int  4 4 4 4 4 4 4 4 4 4 ...
     $ id             : chr [1:680420, 1:4] "9" "9" "37" "37" ...
      ..- attr(*, "dimnames")=List of 2
      .. ..$ : NULL
      .. ..$ : chr  "V1" "V2" "V3" "V4"

Toute aide serait grandement appréciée.

26
Jubbles

Essayer

 data$id <- paste(data$F, data$E, data$D, data$C, sep="_")

au lieu. La beauté du code vectorisé est que vous n'avez pas besoin de boucles ligne par ligne ou de fonctions d'application * équivalentes à la boucle.

Edit Encore mieux est

 data <- within(data,  id <- paste(F, E, D, C, sep=""))
49
Dirk Eddelbuettel

Utilisez unite du package tidyr:

require(tidyr)
data <- data %>% unite(id, F, E, D, C, sep = '_')

Le premier paramètre est le nom souhaité, tous les suivants jusqu'à sep - colonnes à concaténer.

8
JelenaČuklina

Soit stringr::str_c() ou paste() fonctionnera.

require(stringr)
data <- within(data, str_c(F,E,D,C, sep="_")

ou sinon

data <- within(data, paste(F,E,D,C, sep="_")

(stringr offre de meilleures performances sur les grands ensembles de données)

5
smci