【发布时间】:2015-08-17 14:50:57
【问题描述】:
我有点困境,我在一个列表中保存了几个矩阵,每个矩阵的每一行都有一个峰值查找器函数在其上运行。这一切都很好,只有最终结果是保存在列表中的矩阵中的向量。我想要的是一个与我开始时类似的矩阵,但只是将列号标识为每行中的峰值。
我做了一个可重现的例子,我们从一个称为行的列表开始,这些被移动以将每个矩阵拆分为列表中的行。这是基于最大值范围的子集,然后使用峰值查找器功能来查找每行中的峰值。问题就在这里,因为数据格式发生了变化。我不需要峰必须保持在矩阵的同一列中,但我需要将每个矩阵中的每一行分开。就目前而言,我所能做的就是unlist,但是这样我就丢失了最初保存峰值的矩阵行。我不能通过ncol= 制作新矩阵,因为峰值的数量会有所不同.如果 NA 在数据中构成一个完整的矩阵,这绝对可以正常工作。
##function 1: from Quantmod pkg (source here in case mods should be made to the function)
em.peaks <-
function(x, thresh=50) {
pks <- which(diff(sign(diff(x, na.pad=FALSE)),na.pad=FALSE) < 0) + 2
if( !missing(thresh) ) {
if(sign(thresh) < 0)
thresh <- -thresh
pks[x[pks-1]-x[pks] > thresh]
} else pks
}
##function 2: for subsetting data in a given range (by @konrad-rudolph)
between = function (x, lower, upper){
x >= lower & x <= upper }
set.seed(42)
rows<- list()
for (i in 1:10)
{ rows[[i]] <- matrix ( sample.int ( 100, 10*10, TRUE), 10, 10) }
for (i in 1:10)
{ rows[[i]] <- do.call ( rbind, lapply ( rows, function(x) x[i,] )) }
for (i in 1:10)
{ rows[[i]] <- rows[[i]][ between ( apply ( rows[[i]], 1, max), 95, 100), ] }
mypeaks <- list()
for (i in 1:10)
{ mypeaks[[i]] <- matrix ( apply ( rows[[i]], 1, FUN = em.peaks )) }
mypeaks[[1]][c(1:3),]
for (i in 1:10)
{ mypeaks[[i]] <- t ( mypeaks[[i]] ) }
mypeaks[[1]]
for (i in 1:10)
{ mypeaks[[i]] <- matrix ( unlist ( mypeaks[[i]] ), ncol = length ( mypeaks[[i]] )) }
mypeaks[[1]]
我希望在 mypeaks[[1]] 中看到的是 3x4 矩阵(有一些空格),尽管我的输出是一维向量。
【问题讨论】: