行函数将矩阵转换为向量

时间:2015-08-17 14:50:58

标签: r list matrix vector

我有点困境,我在列表中有几个矩阵,每个矩阵的每一行都有一个峰值查找功能。这一切都很好,只有最终结果是保持在列表中的矩阵内的矢量。我想要的是一个类似于我开始的矩阵,但只是列号被识别为每行中的峰值。

我做了一个可重现的例子,我们从一个名为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矩阵(有一些空格),虽然我的输出是一维向量。

1 个答案:

答案 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