从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)
。 子集
函数。这总是给我返回错误,通常提示我的论点之一不合逻辑。我尝试使用which
来解决这个问题,但这并没有帮助。
我还有哪些其他选择?
最佳答案
如果您使用magrittr
,您可以使用
combinations(5,2) %>% .[.[,1]>1,]
这避免了重新计算昂贵的组合
两次的需要。
但是为什么要这么努力避免变量呢?最终使用的内存和计算时间都会加倍。您也反对编写函数吗?为什么不呢
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,])
关于r - 对作为函数输出的列表进行子集化,而不将输出声明为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61445465/