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

标签 r

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

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

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

col1 col2
y    2
x    1 

所需的输出数据帧是:

数据框1(df1):

col1 col2 col3
x1    y1   y2   
x2    y4   y5

数据框2(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. 使用 dfi 的 col1 查找 df 中的“x”和“y”列。对于 x --> xi 和 y --> yi。将结果放入如下列表中:

      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 ,并使用 Mapcombin 列出 ll 查找所有组合。我们还使用辅助函数 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

关于通过分区列对数据框的列进行 R 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29020265/

相关文章:

R - 通过用序列的开始值和结束值替换连续值来生成总结整数向量的字符串

r - 从相似字符串的向量中获取唯一字符串

r - 将 googleway 输出转换/导出到数据框

r - 在 R 中迭代 POSIXlt

r - group_by dplyr 未分组

c# - 如何通过 VBnet(或 C#)与 R 通信

r - 如何从 lme4 获得随机效应(BLUPs/条件模式)的协方差矩阵

r - 使用 dplyr 计算列之间的差异并将结果保存在新的列中

r - 如何将table()转换为R中的矩阵

r - 使用ifelse在R中创建新变量,但收到错误消息意外的 '='