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



我的问题建立在某人之前发布的另一个问题之上:适用于所有参数的组合 [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和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"]))
}

最新更新