Concaténer les lignes à travers des colonnes spécifiques de dataframe
j'ai une base de données avec des colonnes qui, lorsqu'elles sont concaténées (en ligne) comme une chaîne, me permettraient de diviser la base de données dans une forme désiré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 en une chaîne (avec le caractère de soulignement comme séparateur). Ci-dessous est ma tentative infructueuse à 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.
3 réponses
data$id <- paste(data$F, data$E, data$D, data$C, sep="_")
à la place. La beauté du code vectorisé est que vous n'avez pas besoin de boucles ligne par ligne, ou des fonctions d'application équivalentes à des boucles*.
Modifier Encore mieux, c'est
data <- within(data, id <- paste(F, E, D, C, sep=""))
Utiliser unite
tidyr
package:
require(tidyr)
data <- data %>% unite(id, F, E, D, C, sep = '_')
le premier paramètre est le nom désiré, tous les suivants jusqu'à sep
- colonnes à concaténer.
stringr::str_c()
ou paste()
fonctionne.
require(stringr)
data <- within(data, str_c(F,E,D,C, sep="_")
or else
data <- within(data, paste(F,E,D,C, sep="_")