来自 gtools
馆,采取 combinations(5,2)
. 这就给出了下面的输出。
> combinations(5,2)
[,1] [,2]
[1,] 1 2
[2,] 1 3
[3,] 1 4
[4,] 1 5
[5,] 2 3
[6,] 2 4
[7,] 2 5
[8,] 3 4
[9,] 3 5
[10,] 4 5
如果不把这个输出声明为一个变量我希望从这个输出中删除第一列中值为1的所有元素,并以与原始输出相同的格式返回结果列表。
到目前为止,我已经尝试过。
(combinations(5,2))[(combinations(5,2))[,1]>1]
. 这给出了类似于所需的数字,但输出的不是一个数组,而是一个一维的数字向量。它看起来是一个一维的数字向量。(combinations(5,2))[-combinations(5,2)[,1]>1]
. 这总是返回 integer(0)
.subset
函数。这个函数总是返回错误,通常抱怨我的一个参数不符合逻辑。我试着通过使用 which
但这并没有帮助。我还有什么其他选择?
这样就可以了。
combinations(5, 2)[combinations(5, 2)[, 1] > 1, ]
#> [,1] [,2]
#> [1,] 2 3
#> [2,] 2 4
#> [3,] 2 5
#> [4,] 3 4
#> [5,] 3 5
#> [6,] 4 5
不过要记住,它的工作原理是 combinations
计算两次。
这个版本和你第一次尝试的区别在于"> 1 "后面的逗号。
如果您使用 magrittr
你可以用
combinations(5,2) %>% .[.[,1]>1,]
这就避免了需要重新计算昂贵的 combinations
计算两次。
但为什么要如此努力地避免一个vaariable呢?你最终会使使用的内存和计算时间增加一倍。你是不是也反对写一个函数?为什么不写呢?
colFilter <- function(x, col, fun) x[fun(x[,col]),]
然后你就可以做
colFilter(combinations(5,2), 1, function(x) x>1)
这样效率会高很多。
或者管线功能将是
withX <- function(x, expr) eval(substitute(expr), list("."=x), parent.frame())
这允许你写一个表达式,在这个表达式中,你传入的值可以通过 .
在你想回避的表达中。
withX(combinations(5,2), .[.[,1]>1,])
你可以这样做。
combinations(5,2)[combinations(5,2)[,1]!=1,]
它看起来不是很好,但它的工作。