首先,请接受我为一个糟糕的头衔道歉 - 我敢肯定会有更好的一个,但我缺乏正确的英语/数学术语,以正确的方式说出来。 我也很确定我的问题很容易,但由于一些基本的数学无知,我甚至不知道如何称呼一个像样的谷歌搜索。
我正在尝试在列对中找到所有可能的项目组合。
给出这样的数据框:
data.frame(obj1 = c("A", "B", "C", "D", "E", "F"),
obj2 = c("B", "C", "D", "E", "F", "A"),
obj3 = c("C", "D", "E", "F", "A", "B"),
obj4 = c("D", "E", "F", "A", "B", "C"),
obj5 = c("E", "F", "A", "B", "C", "D"),
obj6 = c("F", "A", "B", "C", "D", "E"))
obj1 obj2 obj3 obj4 obj5 obj6
1 A B C D E F
2 B C D E F A
3 C D E F A B
4 D E F A B C
5 E F A B C D
6 F A B C D E
我想以每对列的方式添加新行(obj1
- obj2
,obj1
- obj3
,obj1
- obj4
,...,obj5
- obj6
)所有项目组合都会显示。
例如:在第1列对中:obj1
- obj2
,商品A
仅显示商品B
和F
。缺少其他项目级别组合,这就是我想要的。
注意事项:
- 每个项目(A,...,F)只能在数据帧的每一行中出现一次
- 同一个字母对(A-B和B-A)被视为一行中的重复,但不在列中;
实际上,我想逐行增长这个数据框,这样当选择一对随机列时,就会出现6个项目的每个组合。
我的直觉告诉我,我正在看一个90 x 6大小的数据框,但这只是直觉,我无法输入公式并解释我是如何得出这个数字的。)
如果我的问题不明确,答案显而易见或以任何其他方式违反任何规则,请告诉我,以便我可以尝试解释自己
修改
在收到所有评论后,我会尝试更清楚地解释自己。
考虑这个简单的实验条件表,我们称之为 table1 ,并将其视为主题表之间的对象:
在这个更简单的情况下,每个参与者将以下列方式呈现从列(col1,col2,col3)中取出的6对目标项目(A,B,C)( table2 - 在主题表内:
这6项试验保证每对中的每个参与者目标项目的每个组合都存在。
如果我在每个参与者的固定顺序(例如:快乐,悲伤,聪明,无聊,困惑,疲倦)中呈现6种不同的特征(每个试验一次),每个参与者,3个参与者将呈现每个特征关于目标项目的每个组合
对于参与者1 - 特质快乐将呈现目标A - B
对于参与者2 - 特征快乐将呈现目标B - C
对于参与者3 - 特征快乐将呈现目标C - A
注意一个(理论上的)B - A集合将被视为重复。
我正在寻找的方法是将 table1 从上面的3个项目示例扩展为6项 table1 。 当然, table2 也会增长,但是这一点已经得到了解决。 表1 是导致我出现问题的原因。
这就是起点的样子
感谢您的帮助。 最好的问候。
答案 0 :(得分:1)
再看一遍,考虑以下开始位置,可用于生成6种组合,如Maurits Evers的答案所示。
A B C D E F
A C E B D F
A E D C B F
A D B E C F
此系列是通过获取前一个位置的1 3 5 2 4 6位置生成的。所有轮班,这是24种不同的顺序。
从
开始,您可以以类似的方式再生成24个F E D C B A
我很确定我们可以通过
获得另一个A B C E F D
这可能意味着以下内容也很好:
A C F B E D
A F E C B D
A E B F C D
(同样适用于所有F -> A
个。
这就是96.我错过了任何一个或重复吗?
答案 1 :(得分:1)
注意:我不确定你追求的是什么。我的回答似乎没有解决你的问题,但是由于在@ MelissaKey的回答中引用,我会把它留下来。
定义一个移位函数,将数字向量的条目循环移位n
到左侧
shift <- function(x, n = 1) {
if (n == 0) x else c(tail(x, -n), head(x, n))
}
如果我们现在从初始向量v
开始,该向量对应于预期输出的第一行data.frame
v <- c("A", "B", "C", "D", "E", "F")
我们可以通过rbind
连续移位的v
do.call(rbind, lapply(0:(length(v) - 1), function(i) shift(v, i)))
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] "A" "B" "C" "D" "E" "F"
#[2,] "B" "C" "D" "E" "F" "A"
#[3,] "C" "D" "E" "F" "A" "B"
#[4,] "D" "E" "F" "A" "B" "C"
#[5,] "E" "F" "A" "B" "C" "D"
#[6,] "F" "A" "B" "C" "D" "E"
这适用于任何长度为k
的任何初始向量,从而产生维度matrix
的最终k x k
。