【问题标题】:Generate unique row combinations where all values in a row are treated as a single element生成唯一的行组合,其中一行中的所有值都被视为单个元素
【发布时间】:2015-12-29 20:08:37
【问题描述】:

尝试生成行的每个唯一组合,其中行中的所有值都被视为单个元素。例如:

  Var1  Var2  Var3 
1  a     b     a
2  b     a     c
3  c     c     b
4  d     d     d

创建组合的位置:

  Var1 Var2 Var3 Var4 Var5 Var6  
1  a    b    a    b    a    c
2  a    b    a    c    c    b
3  a    b    a    d    d    d
4  b    a    c    c    c    b
5  b    a    c    d    d    d
6  c    c    b    d    d    d

我正在使用 do.call(rbind, Map(expand.grid, l1, l2) 玩 Map,但每个变量都被视为一个单独的值,而我需要整个行组合。

【问题讨论】:

    标签: r


    【解决方案1】:
    combs <- combn(1:nrow(df1), 2)
    do.call(rbind, Map(function(i,j) cbind(df1[i,],df1[j,]), combs[1,], combs[2,]))
    # Var1 Var2 Var3 Var1 Var2 Var3
    # 1     a    b    a    b    a    c
    # 11    a    b    a    c    c    b
    # 12    a    b    a    d    d    d
    # 2     b    a    c    c    c    b
    # 21    b    a    c    d    d    d
    # 3     c    c    b    d    d    d
    

    这种方法首先创建可能项目的组合。在您的案例中,每一行代表一个项目。因此,可以根据组合索引对 data.frame 进行子集化。 Mapdo.call(rbind, ..) 有助于缩短语法,但重要的是 cbind(df1[i,], df1[j,])

    【讨论】:

    • 非常感谢!正是我需要的。
    • 是否可以扩展它以使用两个相互比较的数据框创建每个唯一的行组合?例如,我的数据可以按“左”和“右”拆分,我只想在左右之间生成唯一的行组合,而不是在其中。
    • 很难从您的描述中看出。尝试创建一个具有所需输出的工作示例来创建一个新问题。
    • cmets 部分不是提出问题的最佳场所。请使用描述和示例数据创建一个新问题。
    • kk 刚刚用这个例子提出了一个新问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2021-12-06
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多