我想在创建唯一组合时将每一行视为单个元素。每个组合应仅在左和右之间。因此,示例中的第一行只能与最后两行组合,第二行只能与最后两行组合。
以前有人帮我提供了以下代码,但只有当我在左右行之间需要它时才按行创建组合。:
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
答案 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))]