我正在处理从多通道电极系统收集的数据,并且我试图使这种运行速度比目前更快,但我找不到任何没有循环的好方法。
它的要点是;我修改了每个列的平均值(这是一个通道),并且需要将列中的每个值与该列的平均值进行比较。如果该值高于调整后的平均值,那么我需要将该值放在另一个数据框中,以便可以轻松读取。
以下是有问题的一些示例代码:
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亿读数,所以如果有人能指出我正确的方向,我会很感激。
答案 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)