如何轻松生成此序列?
c(1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,
2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10)
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来写这个?
我想你想要的东西
t(combn(1:10, 2))
# [,1] [,2]
# [1,] 1 2
# [2,] 1 3
# [3,] 1 4
# [4,] 1 5
# [5,] 1 6
# [6,] 1 7
# [7,] 1 8
# [8,] 1 9
# [9,] 1 10
# [10,] 2 3
# [11,] 2 4
# [12,] 2 5
# [13,] 2 6
# [14,] 2 7
# [15,] 2 8
# [16,] 2 9
# [17,] 2 10
# etc
Run Code Online (Sandbox Code Playgroud)
作为数据框架
as.data.frame(t(combn(1:10, 2)))
Run Code Online (Sandbox Code Playgroud)
这是一个部分dplyr解决方案.(当然使用替换filter()而不使用管道是微不足道的......)expand.grid通常适用于此,但在这种情况下,它比CPak的使用稍微复杂一点,combn因为我们必须切换列顺序:
expand.grid(1:10, 1:10) %>% rev %>% filter(Var2 < Var1) %>% t %>% as.vector
[1] 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 2 3 2 4 2 5 2 6 2
[28] 7 2 8 2 9 2 10 3 4 3 5 3 6 3 7 3 8 3 9 3 10 4 5 4 6 4 7
[55] 4 8 4 9 4 10 5 6 5 7 5 8 5 9 5 10 6 7 6 8 6 9 6 10 7 8 7
[82] 9 7 10 8 9 8 10 9 10
Run Code Online (Sandbox Code Playgroud)
添加base方法:
n = 10
unlist(lapply(1:(n - 1), FUN = function(x) as.vector(rbind(x, (x + 1):n))))
Run Code Online (Sandbox Code Playgroud)
对于大n,我希望这会快得多,因为它根本不使用数据帧并且不会生成不需要的组合然后将它们过滤掉.