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.

18
demandé sur zx8754 2011-06-10 19:55:36

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=""))
40
répondu Dirk Eddelbuettel 2017-05-14 16:26:01

Utiliser unitetidyr 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.

5
répondu Jelena-bioinf 2016-08-09 15:11:40

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="_")
3
répondu smci 2014-04-05 03:09:00