Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 行函数矩阵到向量的转换_R_List_Matrix_Vector - Fatal编程技术网

R 行函数矩阵到向量的转换

R 行函数矩阵到向量的转换,r,list,matrix,vector,R,List,Matrix,Vector,我陷入了一种困境,在一个列表中有几个矩阵,每个矩阵的每一行都有一个峰值查找器函数。这一切都很好,只是最终结果是列表中矩阵中的向量。我想要的是一个类似于我开始使用的矩阵,但只是列数被标识为每行中的峰值 我制作了一个可复制的示例,我们从一个名为rows的列表开始,移动这些行以将每个矩阵拆分为列表中的行。这是基于最大值范围的子集,然后使用峰值查找器函数查找每行中的峰值。随着数据格式的改变,问题就出现在这里。我不需要将峰值保留在矩阵的同一列中,但我需要将每个矩阵中的每一行分开。目前,我所能做的就是取消列

我陷入了一种困境,在一个列表中有几个矩阵,每个矩阵的每一行都有一个峰值查找器函数。这一切都很好,只是最终结果是列表中矩阵中的向量。我想要的是一个类似于我开始使用的矩阵,但只是列数被标识为每行中的峰值

我制作了一个可复制的示例,我们从一个名为rows的列表开始,移动这些行以将每个矩阵拆分为列表中的行。这是基于最大值范围的子集,然后使用峰值查找器函数查找每行中的峰值。随着数据格式的改变,问题就出现在这里。我不需要将峰值保留在矩阵的同一列中,但我需要将每个矩阵中的每一行分开。目前,我所能做的就是
取消列表
,但这样一来,我就失去了峰值最初所在的矩阵行。我不能通过
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]]
###函数1:来自Quantmod pkg(如果需要对函数进行mod,请参见此处的源代码)
em.peaksTry


row.em.peaks感谢您的帮助,效果非常好。我通过绘图(行[[1]][1,]~seq(1,10),type=“l”)确认了这一点;对于(1:3中的i){行(mypeaks[[1]][1,i]-1,行[[1]][1,mypeaks[[1]][1,i]-1],col=“blue”,type=“p”)}
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