我的问题建立在之前由某人发布的另一个问题上: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))
答案 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"]))
}