首页 > 解决方案 > 我们可以使用 apply 函数和 BiCopselect 吗?

问题描述

我们可以使用 apply 函数和 BiCopselect 吗?我试图避免在应用 BiCopselect 时出现循环,但我还没有弄清楚。假设我有一个包含 3 个变量的数据集,并且我想为每一对运行这个函数。任何人都可以建议除循环之外的任何其他方式吗?

这就是我手动操作的方式

coptest12=BiCopSelect(rankresi[,1], rankresi[,2], familyset = NA)
coptest13=BiCopSelect(rankresi[,1], rankresi[,3], familyset = NA)
coptest14=BiCopSelect(rankresi[,1], rankresi[,4], familyset = NA)
coptest15=BiCopSelect(rankresi[,1], rankresi[,5], familyset = NA)
coptest23=BiCopSelect(rankresi[,2], rankresi[,3], familyset = NA)
coptest24=BiCopSelect(rankresi[,2], rankresi[,4], familyset = NA) 
coptest25=BiCopSelect(rankresi[,2], rankresi[,5], familyset = NA) 

依此类推,直到最后一个代码:

    coptest45=BiCopSelect(rankresi[,4], rankresi[,5], familyset = NA) 

我只是尝试使用 apply 功能,但好像我使用过似乎不可能:

sapply(rankresi, BiCopSelect)

错误将是“缺少 BiCopSelect 的 u1 和 u2”

标签: rapply

解决方案


你可以这样做:

myfunc<-function(df1,...) {
  pairs<-combn(names(df1),2,simplify=FALSE)
  res<-sapply(pairs,function(x) BiCopselect(df1[,x[1]],df1[,x[2]],...))
  res
}

result<-myfunc(rankresi)

此函数获取数据帧的名称,然后一次传递给 BiCopselect 一对列。其他参数可以通过....

这是一种不需要数据框具有列名的替代方法:

myfunc<-function(df1,...) {
    pairs<-combn(c(1:ncol(df1)),2,simplify=FALSE)
    res<-sapply(pairs,function(x)  BiCopselect(df1[,x[1]],df1[,x[2]],...))
    res
  }

最后,相同的解决方案,但针对行而不是列的组合:

myfuncbyrow<-function(df1,...) {
  pairs<-combn(c(1:nrow(df1)),2,simplify=FALSE)
 res<-sapply(pairs,function(x) BiCopselect(df1[x[1], ],df1[x[2], ],...))
 res
 }

推荐阅读