使用“from”值列表生成序列

时间:2013-08-26 01:48:27

标签: r

我的目标是使用此起始索引列表生成索引序列列表,如下所示:

values <- matrix (1:25, nrow=5)
indexMatrix <- matrix (seq_along (values) , nrow=nrow(values))
fWidth <- 2
startIndices<- list (
  vert=indexMatrix [1:(nrow (values)-fWidth) , 1:ncol (values)],
  horiz=indexMatrix [1:nrow (values) , 1:(ncol (values)-fWidth)] ,
  upDiag=indexMatrix [fWidth:(nrow (values) - fWidth) , 1:(ncol (values) - fWidth) ] ,
  dnDiag=indexMatrix [1: (nrow (values) - fWidth) , 1: (ncol (values) - fWidth) ]
)

我正在尝试使用这些代码生成序列作为起始点,我希望通过每个子列表逐步通过主列表startIndices,这些子列表只是原始矩阵的子集,生成序列of * x,x + fun,x + 2 * fun,x + 3 * fun ... *(lapply)部分,每个子列表使用列表funs中的不同值(这是for部分),并将它们全部合并到一个大型列表(在此示例中为3个元素)列表中。我的问题似乎没有向from传递正确的seq参数,但我打算在每个子列表上对其进行矢量化,以便从每个值生成序列。

funs<-c(1 , nrow (values) , nrow (values) - 1 , nrow (values) + 1
    )
    #browser()
    seqs<- for (i in seq_along (startIndices)){
        unlist (
            lapply (startIndices [i] , 
            seq , by=funs[i] , to=fWidth*funs[i]) , #from=n from     indexMatrices[i]
        FALSE , FALSE
        )
    }

此代码会生成错误消息Error in seq.default(X[[1L]], ...) : 'from' must be of length 1。我似乎对lapply函数的工作方式有一些基本的误解。我原以为它会使用我的初始数据集作为提供函数的参数列表,但它似乎不是仅使用列表项,而是使用整个列表。这是计算矩阵中所有 n 相邻值的乘积的较大函数的一部分( n = width)。

可以使用以下方法模拟我想要的输出:

startIndices <- sapply (startIndices, as.vector)
attach (startIndices)
startIndices$vert <- matrix (c(vert, vert+1, vert+2), nrow=3, byrow=TRUE )
startIndices$horiz <- matrix (c(horiz, horiz+5, horiz+10), nrow=3, byrow=TRUE)
startIndices$upDiag <- matrix (c(upDiag, upDiag+4, upDiag+8), nrow=3, byrow=TRUE)
startIndices$dnDiag <- matrix (c(dnDiag, dnDiag+6, dnDiag+12), nrow=3, byrow=TRUE)

df <- lapply (startIndices, as.data.frame)
unlist (lapply (df, as.list), FALSE, FALSE)

1 个答案:

答案 0 :(得分:0)

我不太明白你想要做什么,但从快速看看你似乎错误地使用了lapply()seq()。对于seq(),您需要提供fromto以及bylength。更重要的是,它似乎是代码编写的方式,现在您在列表的单个元素上使用lapply()。您应该尝试将整个列表作为lapply()的第一个参数提供,或者如果您需要引用内部的迭代器(在示例中为i),请考虑使用sapply(),如下所示:

 sapply(length(startIndices),function(i) {
        seq(from=?, to=fWidth*funs[i],by=funs[i]) 
 })