2017-01-24 3 views
0

je trame de données mise en jachère:toutes les combinaisons possibles

> my.df 
      x   y 
1 0.4597406 0.8439140 
2 0.4579697 0.7461805 
3 0.5593259 0.6646701 
4 0.3607346 0.7792931 
5 0.8377520 1.0445919 
6 0.5597406 1.0445919 

Je veux créer toutes les combinaisons possibles

> my.df 
      x   y 
1 0.4597406 0.8439140 
2 0.4597406 0.7461805 
3 0.4597406 0.6646701 
4 0.4597406 0.7792931 
5 0.4597406 1.0445919 
6 0.4597406 1.0445919 
7 0.4579697 0.8439140 
8 0.4579697 0.7461805 
9 0.4579697 0.6646701 
... 
(Not all the combinations are showing here - This is to show the format that I would like to get the resulting data frame) 

Utiliser les fonctions suivantes ne donnent pas vraiment les combinaisons exactes.

expand.grid(my.df) 

Quelle est la meilleure façon de générer toutes les combinaisons possibles.

+2

Est-ce la sortie attendue, c'est-à-dire les 9 lignes? – akrun

+1

mettre les colonnes à «facteur» je suppose que cela devrait fonctionner. mais cela donne arnd 36 lignes (6 * 6) –

+0

Je pense que vous cherchez la fonction 'combn'. – user2100721

Répondre

2

Peut-être que nous pouvons utiliser expand.grid de la manière suivante

expand.grid(x = my.df$x, y = my.df$y) 
2

Nous pouvons simplement utiliser expand.grid

res <- expand.grid(my.df) 
dim(res) 
#[1] 36 2 

Ou avec data.table

library(data.table) 
setDT(my.df)[,CJ(x,y)] 
2

Un Cross Join est utile dans cette situation. Puisque vous n'avez pas fourni un exemple reproductible. J'ai créé mon propre Datset.

df=data.frame(x=runif(5), y=runif(5)) 
xx=data.frame(df$x) 
yy=data.frame(df$y) 
library(sqldf) 
sqldf("SELECT * FROM xx CROSS JOIN yy") 
0

Vous pouvez utiliser la fonction de fusion de cette façon

dat <- cars[1:6,1:2] 
dat 
    speed dist 
1  4 2 
2  4 10 
3  7 4 
4  7 22 
5  8 16 
6  9 10 

merge(dat$speed,dat$dist,by=NULL) 
    x y 
1 4 2 
2 4 2 
3 7 2 
4 7 2 
5 8 2 
6 9 2 
7 4 10 
8 4 10 
9 7 10 
10 7 10 
11 8 10 
12 9 10 
13 4 4 
14 4 4 
15 7 4 
16 7 4 
17 8 4 
18 9 4 
19 4 22 
20 4 22 
21 7 22 
22 7 22 
23 8 22 
24 9 22 
25 4 16 
26 4 16 
27 7 16 
28 7 16 
29 8 16 
30 9 16 
31 4 10 
32 4 10 
33 7 10 
34 7 10 
35 8 10 
36 9 10 
2

expand.grid() vous donnera toutes les combinaisons possibles, mais pas les combinaisons uniques. Si vous avez besoin de celui-ci, vous pouvez utiliser une fonction comme celui-ci

unique_comb <- function(data){ 
    x.cur <- unique(data$x) 
    y.cur <- unique(data$y) 
    n.x <- length(x.cur) 
    n.y <- length(y.cur) 
    matrix.com <- matrix(0,ncol=2,nrow=n.x*n.y) 
    ind <- 1 
    for(i in 1:n.x){ 
     for(j in 1:n.y){ 
      matrix.com[ind,] <- c(x.cur[i],y.cur[j]) 
     ind <- ind+1 
     } 
    } 
    return(matrix.com) 
} 

Ou comme des points JTT que cela peut se faire en une ligne avec

expand.grid(unique(data$x),unique(data$y)) 
+1

Vous pouvez également donner des valeurs uniques à 'expand.grid'. Quelque chose comme ceci: 'expand.grid (unique (my.df $ x), unique (my.df $ y))'. –

+0

@JTT oui, vous avez tout à fait raison! Je l'ai testé et t donne la même chose que ma fonction (je savais qu'il y aurait un moyen plus facile). – tatxif

0

Je sais que tout le monde est jeter expand.grid() à vous, voici donc une autre option ...

my.df <- structure(list(x = c(0.4597406, 0.4579697, 0.5593259, 0.3607346, 0.837752, 0.5597406), 
         y = c(0.843914, 0.7461805, 0.6646701, 0.7792931, 1.0445919, 1.0445919)), 
        .Names = c("x", "y"), row.names = c(NA, -6L), class = "data.frame") 

my.df 
#>   x   y 
#> 1 0.4597406 0.8439140 
#> 2 0.4579697 0.7461805 
#> 3 0.5593259 0.6646701 
#> 4 0.3607346 0.7792931 
#> 5 0.8377520 1.0445919 
#> 6 0.5597406 1.0445919 

tidyr a une fonction complete() qui « complète » vos combinaisons de données, qui je crois est ce que vous êtes à l'arrière er.

tidyr::complete(my.df, x, y) 
#> # A tibble: 30 x 2 
#>   x   y 
#>  <dbl>  <dbl> 
#> 1 0.3607346 0.6646701 
#> 2 0.3607346 0.7461805 
#> 3 0.3607346 0.7792931 
#> 4 0.3607346 0.8439140 
#> 5 0.3607346 1.0445919 
#> 6 0.4579697 0.6646701 
#> 7 0.4579697 0.7461805 
#> 8 0.4579697 0.7792931 
#> 9 0.4579697 0.8439140 
#> 10 0.4579697 1.0445919 
#> # ... with 20 more rows 

Note: ce produit les combinaisons uniques - vos lignes de sortie attendus 5 et 6 sont identiques.