问题描述
我正在尝试在 R 中执行一些特征提取,并且我想使用并行处理。我有一个数据框,其中包含初始列,如“id”、“name”和“class”,然后是几千列数字数据。我的特征提取功能如下所示:
extractFeatures = function(thedata,x,alldata,prominentSigs)
{
#thedata: dataframe with a single row and multiple columns:
# class,name,id,numeric data (lots of cols)
#x: vector of x-values
#alldata: dataframe containing all the signals
#prominentSigs: flattened dataframe containing prominent signals
s = as.numeric(thedata[,4:ncol(thedata)])
p = pracma::findpeaks(signal::sgolayfilt(s,p=2,n=23),nups=2,ndowns=2,minpeakheight=mean(s))
f = data.frame(
id = thedata$id[1],class = thedata$class[1],num_peaks = dim(p)[1],base_peak = x[p[which.max(p[,1]),2]],base_peak_width = x[p[which.max(p[,4]] - x[p[which.max(p[,3]],max_peak = x[p[which.max(p[,2]),min_peak = x[p[which.min(p[,mean_peak_wn = mean(x[p[,2]]),sd_peak_wn = sd(x[p[,peak_density = dim(p)[1]/(max(x) - min(x)),mean_peak_intensity = mean(p[,sd_peak_intensity = sd(p[,mean_intensity = mean(s),sd_intensity = sd(s),mean_peak_width = mean(x[p[,4]] - x[p[,3]]),sd_peak_width = sd(x[p[,3]])
)
#similarity features
measure = "pearsonCorrelation"
for (ii in 1:nrow(prominentSigs))
{
n = paste0("simTo",gsub(" ","",prominentSigs$name[ii]))
s2 = as.numeric(prominentSigs[ii,4:ncol(prominentSigs)])
f[[n]] = similarity(s,s2,measure)
}
s2 = rbind(as.matrix(alldata[(alldata$id %in% setdiff(alldata$id,thedata$id)) & (alldata$class == 1),4:ncol(alldata)]),as.matrix(prominentSigs[,4:ncol(prominentSigs)]))
f$simToTrainSig = similarity(s,t(s2),measure)
return(f)
}
similarity = function(s1,measure)
{
switch(measure,cosine = {out = lsa::cosine(s1,s2)},squaredcosine = {out = (lsa:cosine(s1,s2))^2},modcosine = {
out = (
((Matrix::tcrossprod(sqrt(sig1),sqrt(sig2)))^2) /
Matrix::tcrossprod(rowSums(sig1),rowSums(sig2))
)
},pearsonCorrelation = {out = cor(s1,s2)}
)
return(max(out))
}
因此,您会注意到,除了我创建的函数 (pracma::findpeaks
) 之外,我还使用了多个外部函数(signal::sgolayfilt
或 similarity
)。输入 thedata
是来自较大数据框 alldata
的单行,我想从 alldata
的每一行中提取这些特征。我可以这样做的一种方法是使用 w %>% split(.$id) %>% future_map_dfr(.f=extractFeatures,x = x,alldata = w,prominentFentanyl = prominentFentanyl)
,其中 w
是包含 id
、class
、name
、(a bunch of numeric columns)
列的数据框.在这种情况下,split
函数为此使用了相当多的处理时间(不完全确定为什么),总共 48 秒中的 13.20 秒用于 327 个签名。
我想知道是否有可以运行的并行处理函数,该函数将对数据帧的每一行进行操作,并返回一个行数相同但列数不同的新数据帧原始数据框。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)