在R中向量及其负数的所有组合

7
如何在R中找到向量及其负数的所有组合?
例如:
x <- c(1,2,3,4)

将输出

(1,2,3,4), (-1,2,3,4), (1,-2,3,4), (1,2,-3,4), (1,2,3,-4), ... , (-1,-2,-3,-4)
3个回答

7
您可以使用do.callexpand.grid
do.call(expand.grid, lapply(x, function(y) c(y, -y)))
#    Var1 Var2 Var3 Var4
# 1     1    2    3    4
# 2    -1    2    3    4
# 3     1   -2    3    4
# 4    -1   -2    3    4
# 5     1    2   -3    4
# 6    -1    2   -3    4
# 7     1   -2   -3    4
# 8    -1   -2   -3    4
# 9     1    2    3   -4
# 10   -1    2    3   -4
# 11    1   -2    3   -4
# 12   -1   -2    3   -4
# 13    1    2   -3   -4
# 14   -1    2   -3   -4
# 15    1   -2   -3   -4
# 16   -1   -2   -3   -4

lapply(1:4, function(x) c(x, -x))这段代码创建了一个列表,其中每个元素都是由向量中的每个元素及其相反数组成的;在您的情况下,它将会生成list(c(1, -1), c(2, -2), c(3, -3), c(4, -4))。然后do.call将这些列表元素作为参数传递给expand.grid,该函数返回所有可能的组合。

获取参数的一种稍微简单的方法是使用as.data.frame(rbind(x, -x))代替lapply(x, function(y) c(y, -y))


7
@josilber的解决方案的变体是:
 expand.grid(Map(c, x, -x))

1
使用 library(gtools)
gtools::combinations(8,4, c(-4:-1,1:4))

1
我认为这不太对。例如,其中一个输出是“-4 -1 1 4”,而我认为不应该涉及重复项。 - Dason
1
@Dason,你的观点让我觉得原问题不太清楚。“一个向量及其负数的所有组合”对我来说意味着我所提出的内容。 - alexwhitworth
我同意。在问题的所需输出的“,...,”部分中包含什么不是完全清楚的。 - Rich Scriven
2
@RichardScriven 不完全是歧义的,但看起来他们基本上只想生成所有可能的 (+/- 1, +/- 2, +/- 3, +/- 4)。 - Dason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接