如何用R中的向量迭代数组?

时间:2015-08-20 08:43:50

标签: r vector multidimensional-array

我有一组长度为 n 的向量,例如 n = 3

vec1<-c(1,2,3)
vec2<-c(2,2,2)

一个大小为 n ^ n 的多维数组:

threeDarray<-array(0,dim=c(3,3,3))

我想创建一个遍历我的向量集的循环,并将1添加到数组中的相应索引。在分析了上面两个向量之后,数组应该是:

threeDarray[1,2,3]=1
threeDarray[2,2,2]=1

我试图使用多维数组来存储每个向量的出现次数(我的向量是时间序列中的模式)。

2 个答案:

答案 0 :(得分:1)

社区是对的(菜鸟是错的)。多维数组不是解决这个问题的方法。

使用列表的代码示例:

freqPatterns<-function(timeSeries,dimension){
 temp<-character()
 for (i in 1:(length(timeSeries)-dimension+1)){
  pattern<-paste(as.character(rank(timeSeries[i:(i+dimension-1)])-1),collapse=", ")
  #print(pattern)
  temp[[length(temp)+1]] <- pattern
 }
 freqTable=sort(table(temp),decreasing=T)
 return(freqTable)
}

谢谢你们!

答案 1 :(得分:0)

就像你自己发现的那样,我也不会使用multidimensioanl数组。 以下是使用数据框的解决方案:

n=4  # dimension
ll = lapply(vector("list", n), function(x) x=1:n) # build list of vectors (n * 1:n)
df_occurs = expand.grid(ll, KEEP.OUT.ATTRS=F)  # get all combinations
df_occurs$occurences = 0

# for-loop for storing the occurences
for(v in list(vec1, vec2)) {
    v_match = apply(df_occurs[,1:n], 1, function(x) all(x==v))
    df_occurs$occurences[v_match] = 1
}

也许性能是大n的问题。如果可以从矢量中构建字符键,例如

paste(vec1, collapse="")

数据框中的查找会更容易:

df_occurs = data.frame(
    key = apply(expand.grid(ll, KEEP.OUT.ATTRS=F), 1, paste, collapse=""),
    occurences = 0
)

for(key in list(vec1, vec2)) {
    df_occurs$occurences[df_occurs$key==paste(key, collapse="")] = 1
}