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

时间:2017-05-15 05:58:30

标签: r function conditional-statements apply mapply

我的问题建立在之前由某人发布的另一个问题上:mapply for all arguments' combinations [R]

我想使用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& amp;的第一要素tmax应与所有变量组合,tmin&的所有第二个元素。 tmax应该与所有变量等结合使用(如下面的expand.grid()函数)。

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

之后我可以用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))

感谢您的帮助!

修改

预期输出是使用以下代码过滤&#34; alltogether&#34; -dataframe(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))

1 个答案:

答案 0 :(得分:1)

好的,这是两个问题的解决方案。不幸的是,我无法使用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"]))
}
相关问题