R 参数';与条件的结合

R 参数';与条件的结合,r,function,conditional-statements,apply,mapply,R,Function,Conditional Statements,Apply,Mapply,我的问题建立在某人之前发布的另一个问题之上: 我想使用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的所有第二个元素

我的问题建立在某人之前发布的另一个问题之上:

我想使用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))

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

des分位数(var,probs=tmax,na.rm=TRUE)]您能提供预期的输出吗?当然。现在清楚了吗?另外,如何在数据框“alltogether”的“Variable”列中获取变量名(“Var2”、“Var4”、“Var5”)?我在函数“des”中尝试了variable=deparse(替换(var),但它不起作用。谢谢你的任何想法!@YannisVassiliadis我能问你另一个问题吗?你如何在最后的数据帧中添加另一列,该列的相关系数在变量(在“variable”列中)和所有相关系数的固定变量之间(比方说Var1)?我在想这样的函数中的一个代码:
c我很高兴它能为您工作。我正在编辑下面的答案,以包括相关性。我不是100%确定这是您想要的,但如果不是,请告诉我。最大的区别是我在函数中添加了两个参数。第一个参数是必需的,它是您需要的变量t计算相关性。第二个是可选的,它是相关性的方法。如果您不指定它,它将计算“斯皮尔曼”相关性。谢谢!这太令人印象深刻了。要达到您的水平还有很长的路要走:)
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))
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"]))
}