生成行的唯一组合,其中每行被视为由变量分割的单独行

时间:2015-12-30 16:29:03

标签: r

我想在创建唯一组合时将每一行视为单个元素。每个组合应仅在左和右之间。因此,示例中的第一行只能与最后两行组合,第二行只能与最后两行组合。

以前有人帮我提供了以下代码,但只有当我在左右行之间需要它时才按行创建组合。:

combs <- combn(1:nrow(df1), 2)
do.call(rbind, Map(function(i,j) cbind(df1[i,],df1[j,]), combs[1,], combs[2,]))

假设我有一个包含以下内容的数据框:

Side    Var1    Var2
Left     b        a
Left     a        b
Right    b        a
Right    a        b

我希望在单个数据框中使用以下组合:

Side    Var1    Var2    Side     Var1   Var2
Left    b        a      Right      b        a
Left    b        a      Right      a        b
Left    a        b      Right      b        a
Left    a        b      Right      a        b

2 个答案:

答案 0 :(得分:1)

可能有一种更优雅的方式,但这会产生所需的输出。

首先,我们统计有多少&#39; unique&#39;我们拥有的变量     #assuming这对于Var1和Var2

是相同的
n_vars <- length(unique(dat$Var1))

然后我们使用expand.grid

创建索引组合的datafram
#create indices
indices <- expand.grid(1:n_vars,1:n_vars)

并使用它们来创建我们的输出:

#create sub-dataframes
left <- dat[dat$Side=="Left",]
right <- dat[dat$Side=="Right",]

#cbind them together, using our indices to select rows
res <- cbind(left[indices[,1],],right[indices[,2],])
res
# Side Var1 Var2  Side Var1 Var2
# 1   Left    b    a Right    b    a
# 2   Left    a    b Right    b    a
# 1.1 Left    b    a Right    a    b
# 2.1 Left    a    b Right    a    b

答案 1 :(得分:0)

从Heroka略微修改以考虑左侧和权利和重新排序的不同数量,因此每个左/右变量彼此相邻:

n_varsleft <- length(unique(sortdata[sortdata$Side == 'left',][,1]))
n_varsright <- length(unique(sortdata[sortdata$Side == 'right',][,1]))
indices <- expand.grid(1:n_varsleft, 1:n_varsright)
left <- sortdata[sortdata$Side == 'left',]
right <- sortdata[sortdata$Side == 'right',]
res <- cbind(left[indices[,1],], right[indices[,2],])
res <- res[,order(names(res))]