0

在 R 中,是否可以对函数的输出执行“立即”逻辑索引?

为了澄清这个有点模糊的问题,这里有一个小例子,我相信很多人以前都遇到过类似的例子。假设我们有一个向量“数据”,如下所示:

data <- c(1,1,3,5,6,6,8,10,14,15,15,20)

如果我们现在对这个向量应用函数“制表”,结果将是:

tabulate(data)
 [1] 2 0 1 0 1 2 0 1 0 1 0 0 0 1 2 0 0 0 0 1

但是,通常希望只访问向量的那些(在这种情况下)非零的条目,传统上会这样做(我猜......):

tabulate(data)[tabulate(data) != 0]
[1] 2 1 1 2 1 1 1 2 1

但是,在这种情况下,“tabulate(data)”需要计算两次,这显得效率低下甚至浪费;至少,它绝对不优雅。同样,将“tabulate(data)”的结果存储在临时变量中可以如果使用大型数据集会很麻烦。

我现在的问题很简单:是否存在针对此类问题的简单、更优雅(语法)的解决方法?像一个“神奇的”direct.index 函数可以完成这项工作吗?像这样,

direct.index(tabulate.data, condition='!= 0')

...这基本上会丢弃所有在计算时已经不满足索引条件的值,从而使整个过程更快更高效。

为简单起见,此处给出了从“表格”结果中去除零的具体问题;事实上,我在很多不同的情况下都对此感到头疼。也许我也只是对 R 有一些基本的误解......

顺便说一句,我已经研究过“?subset”,但这似乎不是我想要的。

4

1 回答 1

2

手写函数的一个版本

direct.index <- function(x, condition, value){
  index <- eval(call(condition, x, value))
  x[which(index)]
}

direct.index(tabulate(data), '!=', 0)
## [1] 2 1 1 2 1 1 1 2 1

但是,我认为您正在寻找功能table

table(data)
## data
## 1  3  5  6  8 10 14 15 20 
## 2  1  1  2  1  1  1  2  1 
于 2012-06-26T01:42:46.780 回答