从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
来解决此问题,但这没有帮助。我还有其他选择吗?
答案 0 :(得分:2)
如果您使用magrittr
,则可以使用
combinations(5,2) %>% .[.[,1]>1,]
这避免了需要重新计算昂贵的combinations
计算两次的情况。
但是为什么要如此努力避免出现波动?您最终将使用的内存加倍并计算了时间。您是否也反对编写函数?为什么不
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,])
答案 1 :(得分:1)
这有效:
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”之后的逗号
答案 2 :(得分:0)
您可以这样做。
if a + b <= c:
return False
if b + c <= a:
return False
if c + a <= b:
return False
return True
它看起来不太好,但是可以用。