利用R

利用R,r,time-series,permutation,combinatorics,R,Time Series,Permutation,Combinatorics,想象一个时间序列实验,其中3个时间点(a,B,C)中的每一个都被复制了3次: A1, A2, A3, B1, B2, B3, C1, C2, C3 我们希望以所有可能的排列(每次使用不同的时间点复制)连接数据(生成3个周期的时间序列:ABC、ABC、ABC)。例如,以下是一些实现: A1, B1, C1, A1, B1, C2, A1, B1, C3 A1, B2, C1, A1, B2, C2, A1, B2, C3 A1, B3, C1, A1, B3, C2, A1, B3, C3

想象一个时间序列实验,其中3个时间点(
a
B
C
)中的每一个都被复制了3次:

A1, A2, A3, B1, B2, B3, C1, C2, C3
我们希望以所有可能的排列(每次使用不同的时间点复制)连接数据(生成3个周期的时间序列:ABC、ABC、ABC)。例如,以下是一些实现:

A1, B1, C1,  A1, B1, C2, A1, B1, C3
A1, B2, C1,  A1, B2, C2, A1, B2, C3
A1, B3, C1,  A1, B3, C2, A1, B3, C3
有人能推荐一个R脚本来完成这个任务吗?提前感谢,Eran使用扩展网格:

expand.grid(A = c("A1","A2","A3"), B = c("B1","B2","B3"), C = c("C1","C2","C3"))
返回

    A  B  C
1  A1 B1 C1
2  A2 B1 C1
3  A3 B1 C1
...
23 A2 B2 C3
24 A3 B2 C3
25 A1 B3 C3
26 A2 B3 C3
27 A3 B3 C3
编辑:根据下面的评论,这个问题有一个更微妙的技巧

我相当肯定有一种更有效的方法可以做到这一点,但除了测试所有排列之外,我似乎想不出其他方法:

library(gtools)
library(data.table)

dt <- data.table(expand.grid(A = c(1,2,3), B = c(1,2,3), C = c(1,2,3)))

perm <- data.frame(permutations(nrow(dt),3,1:nrow(dt)))
这是一个愚蠢的公式,但它起作用了。它返回满足上述条件的3x3数据帧列表

编辑2:nvm,更简单:

library(data.table)
library(gtools)

dt <- data.table(permutations(n = 3, r = 3, v = 1:3))
perm <- data.frame(permutations(nrow(dt),3,1:nrow(dt), repeats.allowed = T))
mylist <- apply(perm,1,function(x,y){y[as.numeric(x)]},dt)

mylist <- lapply(mylist,t)
mylist <- lapply(mylist,`colnames<-`,c("A","B","C"))
库(data.table)
图书馆(gtools)

dt可能是您可以尝试使用
?expand.grid
谢谢,这似乎很有用,但我们真正想要的是上述三联体的独特组合(例如,复制只使用一次),例如A3 B1 C3;A1 B2 C1;A2 B3C2@Eran将A1、B1、C1;A2,B2,C2;A3、B3、C3也是一种模式?非常感谢,这正是我们需要的!我非常感激!
mylist[as.logical(lapply(mylist,function(x){all(lapply(x,function(y){length(unique(y))}) == 3)}))]
library(data.table)
library(gtools)

dt <- data.table(permutations(n = 3, r = 3, v = 1:3))
perm <- data.frame(permutations(nrow(dt),3,1:nrow(dt), repeats.allowed = T))
mylist <- apply(perm,1,function(x,y){y[as.numeric(x)]},dt)

mylist <- lapply(mylist,t)
mylist <- lapply(mylist,`colnames<-`,c("A","B","C"))