我有点困境,我在列表中有几个矩阵,每个矩阵的每一行都有一个峰值查找功能。这一切都很好,只有最终结果是保持在列表中的矩阵内的矢量。我想要的是一个类似于我开始的矩阵,但只是列号被识别为每行中的峰值。
我做了一个可重现的例子,我们从一个名为rows的列表开始,这些列表被移动以将每个矩阵拆分为列表中的行。这是基于最大值范围的子集,然后使用峰值查找器函数来查找每行中的峰值。随着数据格式的改变,问题出现在这里。我不需要峰值必须保留在矩阵的同一列中,但我需要将每个矩阵中的每一行分开。目前我所能做的只是unlist
,但是由此我失去了最初保存峰的矩阵行。我无法通过ncol=
创建一个新的矩阵作为数字峰值会有所不同。如果数据中的NAs构成一个完整的矩阵,这将完全正常。
##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矩阵(有一些空格),虽然我的输出是一维向量。
答案 0 :(得分:2)
尝试
row.em.peaks <- function(m){
s <- apply(m, 1, FUN = em.peaks )
n <- max(lengths(s))
do.call(`rbind`, lapply(s, function(i)`length<-`(i, n)))
}
mypeaks <- lapply(rows, row.em.peaks)
mypeaks[[1]]
# [,1] [,2] [,3] [,4]
#[1,] 3 6 NA NA
#[2,] 3 6 8 NA
#[3,] 4 6 8 10