155 votes

Combinez deux ou plusieurs colonnes d'un cadre de données en une nouvelle colonne avec un nouveau nom.

Par exemple, si j'ai ceci :

n = c(2, 3, 5) 
s = c("aa", "bb", "cc") 
b = c(TRUE, FALSE, TRUE) 
df = data.frame(n, s, b)

  n  s     b
1 2 aa  TRUE
2 3 bb FALSE
3 5 cc  TRUE

Alors comment puis-je combiner les deux colonnes n y s dans une nouvelle colonne nommée x de telle sorte que ça ressemble à ça :

  n  s     b     x
1 2 aa  TRUE  2 aa
2 3 bb FALSE  3 bb
3 5 cc  TRUE  5 cc

14voto

yanes Points 400

Nous pouvons utiliser coller0 :

df$combField <- paste0(df$x, df$y)

Si vous ne voulez pas qu'un espace de remplissage soit introduit dans le champ concaténé. Cette option est plus utile si vous prévoyez d'utiliser le champ combiné comme un identifiant unique représentant les combinaisons de deux champs.

8voto

avallecam Points 569

Au lieu de

  • paste (espaces par défaut),
  • paste0 (forcer l'inclusion des manquants NA comme caractère) ou
  • unite (contraint à 2 colonnes et 1 séparateur),

Je suggérerais une alternative aussi souple que paste0 mais plus prudent avec NA : stringr::str_c

library(tidyverse)

# check the missing value!!
df <- tibble(
  n = c(2, 2, 8),
  s = c("aa", "aa", NA_character_),
  b = c(TRUE, FALSE, TRUE)
)

df %>% 
  mutate(
    paste = paste(n,"-",s,".",b),
    paste0 = paste0(n,"-",s,".",b),
    str_c = str_c(n,"-",s,".",b)
  ) %>% 

  # convert missing value to ""
  mutate(
    s_2=str_replace_na(s,replacement = "")
  ) %>% 
  mutate(
    str_c_2 = str_c(n,"-",s_2,".",b)
  )
#> # A tibble: 3 x 8
#>       n s     b     paste          paste0     str_c      s_2   str_c_2   
#>   <dbl> <chr> <lgl> <chr>          <chr>      <chr>      <chr> <chr>     
#> 1     2 aa    TRUE  2 - aa . TRUE  2-aa.TRUE  2-aa.TRUE  "aa"  2-aa.TRUE 
#> 2     2 aa    FALSE 2 - aa . FALSE 2-aa.FALSE 2-aa.FALSE "aa"  2-aa.FALSE
#> 3     8 <NA>  TRUE  8 - NA . TRUE  8-NA.TRUE  <NA>       ""    8-.TRUE

Créé le 2020-04-10 par le paquet reprex (v0.3.0)

note supplémentaire de str_c documentation

Comme la plupart des autres fonctions R, les valeurs manquantes sont "infectieuses" : chaque fois qu'une valeur manquante est combinée avec une autre chaîne, le résultat sera toujours manquant. Utilisez str_replace_na() pour convertir NA a "NA"

5voto

Ben Ernest Points 128

Il existe d'autres bonnes réponses, mais dans le cas où vous ne connaissez pas à l'avance les noms des colonnes ou le nombre de colonnes que vous voulez concaténer, ce qui suit est utile.

df = data.frame(x = letters[1:5], y = letters[6:10], z = letters[11:15])
colNames = colnames(df) # could be any number of column names here
df$newColumn = apply(df[, colNames, drop = F], MARGIN = 1, FUN = function(i) paste(i, collapse = ""))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X