将逐列比较矢量化为单独的值

时间:2017-08-07 18:00:13

标签: r

我正在处理从多通道电极系统收集的数据,并且我试图使这种运行速度比目前更快,但我找不到任何没有循环的好方法。

它的要点是;我修改了每个列的平均值(这是一个通道),并且需要将列中的每个值与该列的平均值进行比较。如果该值高于调整后的平均值,那么我需要将该值放在另一个数据框中,以便可以轻松读取。

以下是有问题的一些示例代码:

readout <- data.frame(dimnmames <- c("Values"))
#need to clear the dataframe in order to run it multiple times without errors
#timeFrame is just a subsection of the original data, 60 channels with upwards of a few million rows
readout <- readout[0,]
for (i in 1:ncol(timeFrame)){
  for (g in 1:nrow(timeFrame)){
    if (timeFrame[g,i] >= posCompValues[i,1]) 
      append(spikes, timeFrame[g,i])
  }
}

数据范围从50万到超过1.3亿读数,所以如果有人能指出我正确的方向,我会很感激。

1 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

返回x大于y的值:

cmpfun <- function(x,y) return(x[x>y])

对于timeFrame的每个元素(列),与posCompValues的第一列的相应值进行比较

vals1 <- Map(cmpfun,timeFrame,posCompValues[,1])

将列表折叠为单个向量:

spikes <- unlist(vals1)

如果要同时保存值和相应的列,可能需要将其解压缩到for循环中:

resList <- list()
for (i in seq(ncol(timeFrame))) {
   tt <- timeFrame[,i]
   spikes <- tt[tt>posCompVals[i,1]]
   if (length(spikes)>0) {
      resList[[i]] <- data.frame(value=spikes,orig_col=i)
   }
}
res <- do.call(rbind, resList)