mapply / expand.grid () 用于参数与条件的组合

mapply / expand.grid () for argument's combination with a condition

我的问题基于某人之前发布的另一个问题:

我想使用 mapply 将一个函数应用于多个参数,这适用于我下面的代码。但是我想添加一个条件,这样就不会合并所有的 tmin- 和 tmax- 值,而是只有第一个 tmin 和第一个 tmax,第二个 tmin 和第二个 tmax(如果tmin == 0.01 & tmax == 0.99 或如果 tmin == 0.05 & tmax == 0.95,但例如 tmin == 0.01 不应与 tmax == 0.95 组合)。 但是 tmin 和 tmax 的第一个元素应该与所有变量组合,tmin 和 tmax 的所有第二个元素应该与所有变量组合,等等(如下面的 expand.grid() 函数)。

最后我应该有一个名为 "alltogether" 的数据框,但我应该有 15 行符合所描述的条件,而不是现在的 75 行。

之后我可以用 dplyr::filter 过滤行,但是有没有一种好的方法可以在函数中包含这个条件?

这里是一个示例数据框:

 dataframe <- data.frame(personID = 1:10, 
                  Var1 = c(4, 6, 3, 3, 7, 1, 20, NA, 12, 2),
                  Var2 = c(5, 4, 5, 6, 9, 14, 14, 1, 0, NA),
                  Var3 = c(NA, 15, 12, 0, NA, NA, 2, 7, 6, 7),
                  Var4 = c(0, 0, 0, 0, 1, 0, 1, 4, 2, 1), 
                  Var5 = c(12, 15, 11, 10, 10, 15, NA, 10, 13, 11))

这里是我目前的代码:

des <- function(var, tmin, tmax){
  v <- var[var >= quantile(var, probs = tmin, na.rm = TRUE) &
             var <= quantile(var, probs = tmax, na.rm = TRUE)]
  d <- psych::describe(v)
  df <- cbind(variable = deparse(substitute(var)), tmin = tmin, tmax = tmax, d)
  print(df)
}
args = expand.grid(var = dataframe[, c("Var2", "Var4", "Var5")], tmin = c(0.01, 0.05, 0.1, 0.2, 0.25), tmax = c(0.99, 0.95, 0.9, 0.8, 0.75))

alltogether <- do.call("rbind", mapply(FUN = des, var = args$var, tmin = args$tmin, tmax = args$tmax,  SIMPLIFY = FALSE))

感谢您的帮助!

编辑:

预期输出是使用以下代码过滤 "alltogether"-数据帧后的输出(16 个变量中的 15 个观测值):

alltogether <- alltogether%>%
  dplyr::filter((tmin == 0.01 & tmax == 0.99) | 
                (tmin == 0.05 & tmax == 0.95) |
                (tmin == 0.1 & tmax == 0.9) |
                (tmin == 0.2 & tmax == 0.8) | 
                (tmin == 0.25 & tmax == 0.75))

好的,这是解决这两个问题的方法。不幸的是,我无法使用 mapply 得到一个,所以我不得不依赖一个很好的旧 for 循环(但它仍然更快,因为它不必进行所有额外的计算)。另外,我更改了函数以根据需要为您提供变量的名称。最大的区别是我没有使用 expand.grid,而是 merge。最后,它结合了您上面的评论。

des <- function(var, tmin, tmax, cor.var, cor.method = c("spearman", "pearson", "kendall")){
  var[var < quantile(var, probs = tmin, na.rm = TRUE) |
        var > quantile(var, probs = tmax, na.rm = TRUE)] <- NA
  d <- psych::describe(var)
  correlation<- cor(cor.var, var, use="pairwise.complete", match.arg(cor.method))
  df <- cbind(variable = names(var), tmin = tmin, tmax = tmax, d, correlation)
  names(df)[length(names(df))]<- paste0("correlation_with_", names(cor.var))  
  print(df)
}

minmax = data.frame(tmin = c(0.01, 0.05, 0.1, 0.2, 0.25), tmax = c(0.99, 0.95, 0.9, 0.8, 0.75))
args<- merge(c("Var2", "Var4", "Var5"), minmax)
args[,1]<- as.character(args[,1])

    alltogether<- NULL
for (i in 1:nrow(args)){
    alltogether<- rbind(alltogether, des(var = dataframe[args[i,1]], 
                       tmin = args[i, 2], tmax=args[i, 3], cor.var = dataframe["Var1"]))
}