J'ai deux vecteurs:

a <- c(1,2,3)
b <- c(11,12,13)

Je souhaite créer une combinaison de noms de colonnes (3 * 3 = 9) de sorte qu'ils utilisent les valeurs des deux:

paper1grid11 
paper1grid12
paper1grid13
paper2grid11
paper2grid12
paper2grid13
paper3grid11
paper3grid12
paper3grid13

J'ai essayé d'utiliser la commande paste0 mais cela ne fait pas de combinaison. Au lieu de cela, il crée simplement 3 noms de colonnes.

paste0("paper", a,"grid", b)

Je ne veux pas utiliser de boucle for

0
Deb 19 juin 2019 à 15:32

5 réponses

Meilleure réponse

Vous pouvez le faire avec expand.grid.

a <- c(1,2,3)
b <- c(11,12,13)
do.call(paste0, expand.grid("paper", a, "grid", b))
6
jkd 19 juin 2019 à 12:38

Vous pouvez utiliser outer, c'est-à-dire

outer(a, b, function(x, y) paste0('paper', x, 'grid', y))
#     [,1]           [,2]           [,3]          
#[1,] "paper1grid11" "paper1grid12" "paper1grid13"
#[2,] "paper2grid11" "paper2grid12" "paper2grid13"
#[3,] "paper3grid11" "paper3grid12" "paper3grid13"

Ou enroulez-le autour de c pour obtenir la réponse sous forme de vecteur, c'est-à-dire

c(outer(a, b, function(x, y) paste0('paper', x, 'grid', y)))
#[1] "paper1grid11" "paper2grid11" "paper3grid11" "paper1grid12" "paper2grid12" "paper3grid12" "paper1grid13" "paper2grid13" "paper3grid13"
4
Sotos 19 juin 2019 à 12:40

Ce message est balisé avec data.table, voici donc une solution data.table:

CJ(a, b)[, paste0("paper", a, "grid", b)]

# [1] "paper1grid11" "paper2grid11" "paper3grid11" "paper1grid12" "paper2grid12"
# [6] "paper3grid12" "paper1grid13" "paper2grid13" "paper3grid13
3
sindri_baldur 19 juin 2019 à 12:51
apply(expand.grid("paper", a, "grid", b), 1, paste, collapse="")
1
Jason Mathews 19 juin 2019 à 12:41

Vous pouvez utiliser le croisement ()

library(tidyverse)

crossing("paper",a,"grid",b)%>%unite(`"paper"`,a,`"grid"`,b, col = "col1",sep="")%>%pull(col1)

[1] "paper1grid11" "paper1grid12" "paper1grid13" "paper2grid11" "paper2grid12" "paper2grid13"
[7] "paper3grid11" "paper3grid12" "paper3grid13"
1
TobKel 21 juin 2019 à 11:46