通过分区列来对数据帧的列进行R组合

时间:2015-03-12 21:11:14

标签: r

让我有这样一个数据框(df):

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

让另一个输入数据帧(dfi)为:

col1 col2
y    2
x    1 

所需的输出数据帧是:

data frame1(df1):

col1 col2 col3
x1    y1   y2   
x2    y4   y5

data frame2(df2):

col1 col2 col3
y3    y1   x4
      y4

数据框3(df3):

col1 col2 col3
y3    x3   y2
           y5

即,

我想创建数据框

  • 每列仅包含x值或仅包含y值
  • 输入数据帧(dfi)表示每个输出dafa帧只包含2" y"列和1" x"柱
  • 必须生成这些数据帧的所有可能的不同组合。

如何使用R创建此类数据框?我的原始数据帧要大得多,第二个输入数据帧dfi可以改变。我知道这是一个很难的问题。我会很高兴得到任何帮助。非常感谢。

1 个答案:

答案 0 :(得分:2)

不完全是您要查找的内容(不是相同的列顺序)。问题非常具体,所以很难解释代码,但这里有一些注意事项:

  1. 使用dfi的col1在df中查找“x”和“y”列。对于x - > xi和y - >义。将结果放在如下列表中:

      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. 使用dfi的col2,并列出ll以使用Mapcombin查找所有组合。我们还使用辅助函数FUN来均匀化矢量长度。

  3. 这里是整个代码:

    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