web-dev-qa-db-fra.com

Combinez deux colonnes ou plus dans un cadre de données dans une nouvelle colonne portant 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 et s dans une nouvelle colonne nommée x telle qu'elle ressemble à ceci:

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

Utilisez paste.

 df$x <- paste(df$n,df$s)
 df
#   n  s     b    x
# 1 2 aa  TRUE 2 aa
# 2 3 bb FALSE 3 bb
# 3 5 cc  TRUE 5 cc
100
mnel

Pour insérer un séparateur:

df$x <- paste(df$n, "-", df$s)
23
Little Bee

Quelques exemples avec des AN et leur suppression en utilisant apply

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

paste_noNA <- function(x,sep=", ") {
gsub(", " ,sep, toString(x[!is.na(x) & x!="" & x!="NA"] ) ) }

sep=" "
df$x <- apply( df[ , c(1:6) ] , 1 , paste_noNA , sep=sep)
df
9
Ferroao

Comme déjà mentionné dans les commentaires de Uwe et UseR, une solution générale au format tidyverse serait d'utiliser la commande unite:

library(tidyverse)

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

df = data.frame(n, s, b) %>% 
  unite(x, c(n, s), sep = " ", remove = FALSE)
9
Quentin Perrier

Utiliser dplyr::mutate:

library(dplyr)
df <- mutate(df, x = paste(n, s)) 

df 
> df
  n  s     b    x
1 2 aa  TRUE 2 aa
2 3 bb FALSE 3 bb
3 5 cc  TRUE 5 cc
7
sbha

Nous pouvons utiliser paste:

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

Si vous ne souhaitez pas que de l'espace de remplissage soit introduit dans le champ concaténé. Ceci est plus utile si vous prévoyez d’utiliser le champ combiné en tant qu’identifiant unique représentant des combinaisons de deux champs.

5
yanes

Au lieu de

  • paste (non rangé),
  • paste0 (séparateur defauld) ou
  • unite (contraint à 2 colonnes et 1 séparateur),

Je suggérerais une alternative plus souple: stringr::str_c

library("tidyverse")
df %>% mutate(x=str_c(n,"-",s,".",b))
#> # A tibble: 3 x 4
#>       n s     b     x         
#>   <dbl> <fct> <lgl> <chr>     
#> 1     2 aa    TRUE  2-aa.TRUE 
#> 2     3 bb    FALSE 3-bb.FALSE
#> 3     5 cc    TRUE  5-cc.TRUE 
5
avallecam