2015-03-12 3 views
2

Пусть I есть такой кадр данных (Df):R-комбинации столбцов кадра данных путем разделения столбцов

col1 col2 col3 
x1  x3 x4 
x2  y1 y2 
y3  y4 y5 

И пусть в другой кадр входных данных (DFI) является:

col1 col2 
y 2 
x 1 

Нужные кадры Выходные данные:

frame1 данных (DF1):

col1 col2 col3 
x1 y1 y2 
x2 y4 y5 

frame2 данные (df2):

col1 col2 col3 
y3 y1 x4 
     y4 

данные frame3 (DF3):

col1 col2 col3 
y3 x3 y2 
      y5 

А именно,

Я хочу создать кадры данных, где

  • каждый столбец будет состоят только из значений x или только значений y
  • , входной кадр данных (dfi) говорит, что каждый выходной кадр dafa будет состоять из двух столбцов «y» и столбца «x»
  • и должны быть созданы все возможные различные комбинации таких кадров данных.

Как создать такие фреймы данных, используя R? Мой исходный кадр данных намного больше, а второй входной фрейм данных dfi может измениться. Я знаю, что это сложная проблема. Я буду очень рад за любую помощь. Большое спасибо.

ответ

2

Не совсем то, что вы ищете (не тот же порядок столбцов). Проблема действительно очень специфичен, так что трудно объяснить код, но здесь некоторые примечания:

  1. Используйте col1 из ФРИ найти «х» и «у» столбцы в ФР. При х -> х1 и при у -> у. Поместите результат в списке, как этот:

    List of 2 
        $ :List of 3 
        ..$ col1: chr "y3" 
        ..$ col2: chr [1:2] "y1" "y4" 
        ..$ col3: chr [1:2] "y2" "y5" 
        $ :List of 3 
        ..$ col1: chr [1:2] "x1" "x2" 
        ..$ col2: chr "x3" 
        ..$ col3: chr "x4" 
    
  2. Используйте col2 из DFI, и список ЛЛ найти все комбинации, используя Map и combin. Мы используем также вспомогательную функцию FUN для гомогенизации длины вектора.

Вот весь код:

ll <- lapply(dfi$col1,function(patt) lapply(df,function(x)x[grep(patt,x)])) 
M <- max(dfi$col2) 
## helper function to add '' if vectors don't have the same size 
FUN = function(x){ 
    res <- lapply(x,function(y){ 
    if(length(y)<M) 
     y <- c(y,rep('',M-length(y))) 
    else y 
    }) 
    as.data.frame(res) 
} 

ll_dat <- Map(function(x,m)combn(x,m,simplify=F,FUN),ll,dfi$col2) 


Map(cbind,ll_dat[[1]],rev(ll_dat[[2]])) 

# [1]] 
# col1 col2 col3 
# 1 y3 y1 x4 
# 2  y4  
# 
# [[2]] 
# col1 col3 col2 
# 1 y3 y2 x3 
# 2  y5  
# 
# [[3]] 
# col2 col3 col1 
# 1 y1 y2 x1 
# 2 y4 y5 x2