【问题标题】:Row function converting matrix to vector行函数将矩阵转换为向量
【发布时间】: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 矩阵(有一些空格),尽管我的输出是一维向量。

【问题讨论】:

    标签: r list matrix vector


    【解决方案1】:

    试试

    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
    

    【讨论】:

    • 感谢您,完美运行。我通过 plot(rows[[1]][1,]~seq(1,10),type="l"); 确认了这项工作for (i in 1:3) { lines(mypeaks[[1]][1,i]-1 , rows[[1]][1,mypeaks[[1]][1,i]-1],col ="蓝色",type="p") }
    猜你喜欢
    • 1970-01-01
    • 2016-04-01
    • 2017-06-10
    • 1970-01-01
    • 2022-11-12
    • 2021-04-29
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多