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

问题描述 投票:1回答:2

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

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

  • 类似于在 "L "中所建议的公式 这个 答案。例如: (combinations(5,2))[(combinations(5,2))[,1]>1]. 这给出了类似于所需的数字,但输出的不是一个数组,而是一个一维的数字向量。它看起来是一个一维的数字向量。
  • 通过减号去除不需要的输出。例如 (combinations(5,2))[-combinations(5,2)[,1]>1]. 这总是返回 integer(0).
  • subset 函数。这个函数总是返回错误,通常抱怨我的一个参数不符合逻辑。我试着通过使用 which但这并没有帮助。

我还有什么其他选择?

r list subset
2个回答
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
投票

如果您使用 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,])

0
投票

你可以这样做。

combinations(5,2)[combinations(5,2)[,1]!=1,]

它看起来不是很好,但它的工作。

© www.soinside.com 2019 - 2024. All rights reserved.