子集一个列表,该列表是函数的输出,而不将输出声明为变量

时间:2020-04-26 17:54:48

标签: r list subset

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的所有元素,并以与结果相同的格式返回结果列表原始输出。

到目前为止,我已经尝试过:

  • 类似于this答案中建议的公式。例如,(combinations(5,2))[(combinations(5,2))[,1]>1]。这给出了类似于所需数字的数字,但输出不是数组。它似乎是数字的一维向量。
  • 通过减号删除不需要的输出。例如,(combinations(5,2))[-combinations(5,2)[,1]>1]。这总是返回integer(0)
  • subset函数。这总是为我返回错误,通常会抱怨我的论点之一是不合逻辑的。我尝试使用which来解决此问题,但这没有帮助。

我还有其他选择吗?

3 个答案:

答案 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

它看起来不太好,但是可以用。

相关问题