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
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
Pour insérer un séparateur:
df$x <- paste(df$n, "-", df$s)
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
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)
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
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.
Au lieu de
paste
(non rangé),paste0
(séparateur defauld) ouunite
(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