【发布时间】:2021-06-03 13:07:18
【问题描述】:
我编写了一个函数来对 data.table 中的每一行应用一个 savitzky golay 过滤器。具有测量值的第一列作为参数给出,所有后面的列也包含要过滤的测量值。处理后的行会就地更新。
我的功能有效,但速度很慢。
如何更改函数以使工作更高效和更像 data.table?
MWE:
library(data.table)
library(pracma)
library(datasets)
data(iris)
setDT(iris)
#Reorder columns because function expects columns to apply a filter on
#starting from a defined column to the last column
setcolorder(iris, "Species")
savitzky_golay <- function(dt, id_of_first_sample_col=2, win_size=5) {
c_names_samples <- colnames(dt)[id_of_first_sample_col:ncol(dt)]
for (i in seq(from=1, to=nrow(dt))) {
mat <- as.numeric(dt[i,id_of_first_sample_col:ncol(dt)]) # Get sample data as matrix (one row)
mat <- savgol(mat,fl=win_size,forder=2,dorder=0) # Savitzky-Golay-Filter
dt[i, (c_names_samples) := as.list(mat)] # Update columns of current row by reference
}
# Returns nothing as update is done via reference.
}
savitzky_golay(iris)
【问题讨论】:
标签: r data.table