排列所有组合的行顺序,同时保留其他组合
Posted
技术标签:
【中文标题】排列所有组合的行顺序,同时保留其他组合【英文标题】:permute the order of rows all combinations while keeping the other 【发布时间】:2021-01-29 07:14:22 【问题描述】:我有一个看起来像这样的数据框:
sample<- c("s1", "s2", "s3", "s4")
spines<- c(1,0,0,1)
df<- data.frame(sample, spines)
df
sample spines
1 s1 1
2 s2 0
3 s3 0
4 s4 1
我想创建一个具有所有可能的行顺序组合的新数据框,但我希望每个样本保留变量脊椎的原始值。 我希望它看起来像这样:
new_df
sample spines
1 s1 1
2 s2 0
3 s3 0
4 s4 1
5 s1 1
6 s2 0
7 s4 1
8 s3 0
9 s1 1
10 s3 0
11 s4 1
12 s2 0
13 s1 1
14 s3 0
15 s2 0
16 s4 1
17 s1 1
18 s4 1
19 s2 0
20 s3 0
21 s1 1
22 s4 1
23 s3 0
24 s2 0
25 s2 0
26 s1 1
27 s3 0
28 s4 1
29 s2 0
30 s1 1
31 s4 1
32 s3 0
我找不到办法。 有什么想法和建议吗?
多尔
【问题讨论】:
你能解释一下为什么在你写的时候只有0
s和1
s:我希望每个样本都保留变量spine的原始值 ?
为什么变量spine只有0和1?你能详细说明一下吗?
【参考方案1】:
如前所述(假设您刚刚在spine
列中填充了随机数,以便在您的预期输出中进行说明),一种解决方案是:
df[c(t(gtools::permutations(4, 4))),]
#> sample spines
#> 1 s1 1
#> 2 s2 2
#> 3 s3 3
#> 4 s4 4
#> 1.1 s1 1
#> 2.1 s2 2
#> 4.1 s4 4
#> 3.1 s3 3
#> 1.2 s1 1
#> 3.2 s3 3
#> 2.2 s2 2
#> 4.2 s4 4
#> 1.3 s1 1
#> 3.3 s3 3
#> 4.3 s4 4
#> 2.3 s2 2
#> 1.4 s1 1
#> 4.4 s4 4
#> 2.4 s2 2
#> 3.4 s3 3
#> 1.5 s1 1
#> 4.5 s4 4
#> 3.5 s3 3
#> 2.5 s2 2
#> 2.6 s2 2
#> 1.6 s1 1
#> 3.6 s3 3
#> 4.6 s4 4
#> 2.7 s2 2
#> 1.7 s1 1
#> 4.7 s4 4
#> 3.7 s3 3
#> 2.8 s2 2
#> 3.8 s3 3
#> 1.8 s1 1
#> 4.8 s4 4
#> 2.9 s2 2
#> 3.9 s3 3
#> 4.9 s4 4
#> 1.9 s1 1
#> 2.10 s2 2
#> 4.10 s4 4
#> 1.10 s1 1
#> 3.10 s3 3
#> 2.11 s2 2
#> 4.11 s4 4
#> 3.11 s3 3
#> 1.11 s1 1
#> 3.12 s3 3
#> 1.12 s1 1
#> 2.12 s2 2
#> 4.12 s4 4
#> 3.13 s3 3
#> 1.13 s1 1
#> 4.13 s4 4
#> 2.13 s2 2
#> 3.14 s3 3
#> 2.14 s2 2
#> 1.14 s1 1
#> 4.14 s4 4
#> 3.15 s3 3
#> 2.15 s2 2
#> 4.15 s4 4
#> 1.15 s1 1
#> 3.16 s3 3
#> 4.16 s4 4
#> 1.16 s1 1
#> 2.16 s2 2
#> 3.17 s3 3
#> 4.17 s4 4
#> 2.17 s2 2
#> 1.17 s1 1
#> 4.18 s4 4
#> 1.18 s1 1
#> 2.18 s2 2
#> 3.18 s3 3
#> 4.19 s4 4
#> 1.19 s1 1
#> 3.19 s3 3
#> 2.19 s2 2
#> 4.20 s4 4
#> 2.20 s2 2
#> 1.20 s1 1
#> 3.20 s3 3
#> 4.21 s4 4
#> 2.21 s2 2
#> 3.21 s3 3
#> 1.21 s1 1
#> 4.22 s4 4
#> 3.22 s3 3
#> 1.22 s1 1
#> 2.22 s2 2
#> 4.23 s4 4
#> 3.23 s3 3
#> 2.23 s2 2
#> 1.23 s1 1
【讨论】:
【参考方案2】:我想你可以在 perms
的帮助下从包 pracma
中做到这一点
library(pracma)
df[c(t(perms(1:nrow(df)))),]
【讨论】:
【参考方案3】:我认为这也会根据你的口头目标得到你想要的:
library(gtools)
sample<- c("s1", "s2", "s3", "s4")
p <- permutations(4,4,sample) # create all the sample permutations
sample <- as.vector(t(p)) # convert sample permutations transpose matrix to a vector
p <- permutations(4,4,1:4) # create all the spine permutations
spines <- as.vector(t(p)) # convert spines permutations transpose matrix to a vector
df <- data.frame(sample, spines) # create the data frame
【讨论】:
以上是关于排列所有组合的行顺序,同时保留其他组合的主要内容,如果未能解决你的问题,请参考以下文章
组合数组并保留顺序 - 但优先考虑一个数组的顺序而不是另一个
在将其组合到R中的一个数据帧时,在不同的数据帧中保留重复的行名[重复]
[BZOJ2467] [中山市选2010] 生成树 (排列组合)