2017-01-24 3 views
0

Я парование кадра данных:R все возможные комбинации

> 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 

Я хочу, чтобы создать все возможные комбинации

> 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) 

Используя следующие функции действительно не дают точные комбинаций.

expand.grid(my.df) 

Каков наилучший способ создания всех возможных комбинаций.

+2

Это ожидаемый выход, т. Е. 9 строк? – akrun

+1

установите столбцы в 'factor', я думаю, что это должно сработать. но это дает arnd 36 строк (6 * 6) –

+0

Я думаю, что вы ищете функцию 'combn'. – user2100721

ответ

2

Может быть, мы можем использовать expand.grid следующим образом

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

Мы можем просто использовать expand.grid

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

Или с data.table

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

A Cross Join полезен в этой ситуации. Так как вы не представили воспроизводимый пример. Я создал свой собственный 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

Вы можете использовать функцию Merge таким образом

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) даст вам (все возможные комбинации, но не уникальные комбинации. Если вам нужен последний вы можете использовать функцию как этот

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) 
} 

Или, как JTT указывает, что это может быть сделано в одной строке с

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

Вы также можете указать уникальные значения 'expand.grid'. Что-то вроде этого: 'expand.grid (unique (my.df $ x), unique (my.df $ y))'. –

+0

@JTT да, вы совершенно правы! Я протестировал его, и t дал то же самое, что и моя функция (я знал, что будет более простой способ). – tatxif

0

Я знаю, что все это бросает expand.grid() на вас, так вот еще вариант ...

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 имеет complete() функцию, которая «завершает» свои комбинации данных, которые я считаю, что вы кормовая э.

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 

Примечание: это производит уникальные комбинации - ваши ожидаемые выходные строки 5 и 6 идентичны.

Смежные вопросы