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.
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=""))
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.
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)