紧凑地创建具有命名尺寸和元素的多维数组

时间:2017-03-07 13:38:49

标签: r

不久之前,我想要一种更简单的方法来创建具有命名尺寸的多维数组。

我最终编写了一个对我来说非常好用的功能,但我担心它可能有点像黑客并且可能有更好的方法。所以在将这个传递给同事之前,我在这里寻求建议。

我想要做的是能够创建多维数组,其中维度的名称由向量的名称指定,元素的名称由该向量的内容指定。 e.g。

  sex <- c("F","M")
  name2 <- c("a","b","c")

这可以写出来。

  dimnames1 <- list( sex=sex, name2=name2 )
  dim1 <- sapply(dimnames1, function(x) length(x))
  a <- array(0,dim=dim1, dimnames=dimnames1)
  a

   name2
sex a b c
  F 0 0 0
  M 0 0 0

但我希望能够保持这种紧凑:

我写了这个函数来启用它。

  array_named <- function( ...)
    {

    listArgs <- as.list(match.call()[-1])

    #works only if args are specified by actual ranges not by a varname
    #dimnames1 <- lapply(listArgs,eval)

    #works, I'm not sure why n=3
    dimnames1 <- lapply(listArgs,function(x){eval.parent(x, n=3)})

    #setting dimensions of array from dimnames1
    dim1 <- sapply(dimnames1, function(x) length(x))

    #creating array and filling with fill value
    a <- array(0, dim=dim1, dimnames=dimnames1)

    return(a)
  }

这允许按名称传递矢量:

array_named( sex=sex, name2=name2 )

name2
sex a b c
  F 0 0 0
  M 0 0 0

直接例如

array_named( a=c(1,2), b=c('x','y') )

   b
a   x y
  1 0 0
  2 0 0

这有问题是否有更明智的做法?

0 个答案:

没有答案