如何向量化`[`

时间:2015-07-27 16:28:13

标签: r vectorization

我无法让Vectorize[合作,收到如下所示的错误。从help("[")开始,似乎[的参数名为xij - 但在使用时它们似乎无法正常工作它们为vectorize.args。我可以这样做吗?

## Some data
dat <- data.frame(a=1:10, b=11:20, c=21:30)

## Vectorize with mapply, seems to work
f <- function(i, j, dat) list(dat[i, j])
mapply(f, list(1:2, 3:4), list(1:2, 2:3), MoreArgs = list(dat=dat))
# [[1]]
#   a  b
# 1 1 11
# 2 2 12
# 
# [[2]]
#    b  c
# 3 13 23
# 4 14 24

## Now using Vectorize, apply to data
Vectorize(`[`, c("i", "j"))(x=dat, i=list(1:2, 2:3), j=list(1:2, 2:3))
  

Vectorize([,c(&#34; i&#34;,&#34; j&#34;))出错:     必须指定&#39; vectorize&#39;

的正式参数的名称

但是,这有效(警告命名参数)

`[`(x=dat, i=1:2, j=1:2)

另外,如果我这样做,那就没关系

Vectorize(`[.data.frame`, c("i", "j"))(dat, list(1:2, 2:3), list(1:2, 2:3))

1 个答案:

答案 0 :(得分:10)

记录

Vectorize()不能与原始函数一起使用。来自?Vectorize

 ‘Vectorize’ cannot be used with primitive functions as they do not
 have a value for ‘formals’.

[是R中的原语:

> `[`
.Primitive("[")

由于[已经过矢量化,我甚至没有看到尝试这个的重点。你`[`(x=dat, i=1:2, j=1:2)通常的习惯用语很简单:

dat[1:2, 1:2]

> dat[1:2, 1:2]
  a  b
1 1 11
2 2 12

这个索引也可以是(预先存在的)对象:

i <- 1:2
j <- 1:2
dat[i, j]

> dat[i, j]
  a  b
1 1 11
2 2 12

如果您有多组提取,那么我认为您可以直接在[.data.frame中调用Vectorise方法。 ?Vectorize的示例说明了为函数rep()执行此类操作,这是原始的,因此使用rep.int()代替。