R 将多个变量参数传递给具有apply族的函数

R 将多个变量参数传递给具有apply族的函数,r,R,我有以下向量和变量 x<-c(1,2,3,4,5,7,6,7,8,9,8,7,6,4,5,3,2,2,3,4,5,6,67,7,7) wavelet<-c("d2","s2") n.level<-c(1,2) schirnkfun <- c("soft", "hard", "mid") threshfun<-c("universal", "adaptive", "minimax") threshscale<-c(0.25,1.25) #I sele

我有以下向量和变量

x<-c(1,2,3,4,5,7,6,7,8,9,8,7,6,4,5,3,2,2,3,4,5,6,67,7,7)

wavelet<-c("d2","s2")
n.level<-c(1,2)
schirnkfun <- c("soft", "hard", "mid")    
threshfun<-c("universal", "adaptive", "minimax")
threshscale<-c(0.25,1.25)

#I select one variable from above and use lapply which yields results per variable.

library(wmtsa)
ws <- lapply(threshfun, function(k,x)
wavShrink(x,wavelet= "s2",n.level=2,shrink.fun="hard", thresh.fun= k,threshold=NULL,thresh.scale=1, xform="modwt", noise.variance=-1, reflect=TRUE),x=x)
我的问题是,是否有可能使用apply族将变量和x向量的所有可能组合传递给最后一个函数?比如说

a为不同变量的所有可能组合创建一个数据框,并将其传递给函数,以便函数以类似的方式作用于数据框的行。如何应用于下面简单表达式中的原始数据子集,确保函数也必须考虑向量x

A<-expand.grid(c(1,2), c(3,6), c(4,2), c(2,5,3), c(0.25,1.25))
apply(A[,c('Var1' ,  'Var5' , 'Var2' , 'Var3' , 'Var4')], 1, function (x) sum(x))
b通过在向量上使用mapply,不确定输出是否为每个可能的变量组合的结果,以及所有组合是否都将传递给函数

# so here is my attempt to use apply to the combination of variables. First I create a data frame of variables.
A <- expand.grid(c("d2","s2"), c(1,2),c("soft", "hard"),c("universal", "adaptive", "minimax"),c(0.25,1.25))

# and write the function 
function(k,l,m,n,e,x) (wavShrink(x,wavelet= k,n.level= l,shrink.fun= m, thresh.fun= n,threshold=NULL,thresh.scale= e, xform="modwt", noise.variance=-1, reflect=TRUE)

#Attempt to pass the data frame for lapply without success possibly because lapply is for vectors or lists

A<-expand.grid(c("d2","s2"), c(1,2),c("soft", "hard"),c("universal", "adaptive", "minimax"),c(0.25,1.25))

ws<-lapply(A[,c('Var1' ,  'Var2' , 'Var3' , 'Var4' , 'Var5')],1, function(k,l,m,n,e,x)
wavShrink(x,wavelet= k,n.level= l,shrink.fun= m, thresh.fun= n, threshold=NULL,thresh.scale= e, xform="modwt", noise.variance=-1, reflect=TRUE),x=x)
#Error en match.fun(FUN) : '1' is not a function, character or symbol

#and for mapply which take multiple lists or vectors I pass the variables as vectors, however it fails as it seems I can not pass the x vector to the function

FUN<-function(x,k,l,m,n,e) (wavShrink(x,wavelet= k,n.level= l,shrink.fun= m, thresh.fun= n, threshold=NULL,thresh.scale= e, xform="modwt", noise.variance=-1, reflect=TRUE))
mapply(FUN, c("d2","s2"), c(1,2),c("soft", "hard"),c("universal", "adaptive", "minimax"),c(0.25,1.25),x=x)
#Error en wavShrink(x, wavelet = k, n.level = l, shrink.fun = m, thresh.fun = n,  : 
#Time series must contain more than one point

我对R有点陌生,对apply函数也完全陌生。在尝试使用apply或函数时,我可能犯了一些基本的错误,但是在尝试了两天之后,我决定写一个简单的问题,欢迎任何帮助

我在理解mapply方面取得了一些进步,所以我相信我可以回答我自己的问题

wavelet<-c("d2","s2")
n.level<-c(1,2)
schirnkfun <- c("soft", "hard", "mid")    
threshfun<-c("universal", "adaptive", "minimax")
threshscale<-c(0.25,1.25)
x<-c(1,2,3,4,5,7,6,7,8,9,8,7,6,4,5,3,2,2,3,4,5,6,6,7,7,7,5,6,7,7,8,8,9,0,9,0,8,7,5,4,3,3,4,4,4,4,3,2,2,1,2,3,4,5,6,5,7,8,8,9,9,0,2,3,4,2,3,5,5,2,4,6,7)

w1<- expand.grid(wavelet=wavelet,n.level=n.level,schirnkfun= schirnkfun,threshfun= threshfun,threshscale= threshscale, stringsAsFactors=FALSE)

result<-mapply(function(m,k,p,u,l,x)  (wavShrink(x, wavelet= m,n.level=k,shrink.fun= p,thresh.fun=u, threshold=NULL,thresh.scale= l, xform="modwt", noise.variance=-1, reflect=TRUE)), w1$wavelet,  w1$n.level , w1$schirnkfun,   w1$ threshfun, w1$threshscale ,MoreArgs=list(x=x))

colnames(result)=c(rownames(w1))

列数等于w1的行数,expand,grid中的每一行由函数计算

我建议您首先在一个更简单的示例上尝试一下,以了解它是如何工作的。您似乎遇到了各种各样的错误,来自lappy中的语法错误、wavShrink中的错误等等。为什么不先用一个包含两个或三个变量的简单函数替换wavShrink,然后弄清楚mappy是如何工作的,然后你可以尝试更复杂的函数。我同意一个更简单的函数可以帮助我更好地理解和改进语法问题。让我再试一次,看看是否有类似的非用户定义函数的例子,其中apply是在网络中使用的,而我目前还没有找到。我认为这是一个好主意。这里没有必要重复已编写多次的*apply函数指南。例如,当说出短语:pass all posible composition of variable时,通常意味着演讲者希望使用expand.grid。它将产生一个适合mapply操作的结果。我希望它是expand.grid小波,n.level,schirnkfun,threshfun,threshscale
A<-expand.grid(c(1,2), c(3,6), c(4,2), c(2,5,3), c(0.25,1.25))
apply(A[,c('Var1' ,  'Var5' , 'Var2' , 'Var3' , 'Var4')], 1, function (x) sum(x))