R: Включение цикла в функцию?

#r #function #foreach

#r #функция #foreach

Вопрос:

Следующий код можно использовать для создания data.frame с результатами корреляции Кендалла-Тау и Спирмена рядом друг с другом:

 data(mtcars)
mtcars

correlation <- function(x,y){
  df1 = cor(data.frame(x,y), use="complete.obs", method="kendall")
  df2 = cor(data.frame(x,y), use="complete.obs", method="spearman")
  return(data.frame(df1,df2))
}

correlation(mtcars[1],mtcars[2])
  

Вопрос: Вместо объединения команд в цепочки, можно ли реализовать что-то вроде цикла для метода two?

 methods <- ("kendall", "spearman")

correlation <- function(x,y){
  df = cor(data.frame(x,y), use="complete.obs", method=methods)
  return(data.frame(df))
}

correlation(mtcars[1],mtcars[2])
#This should output the two results, just as above.
  

Я попробовал список, но это не увенчалось успехом.

Ответ №1:

Вы могли бы использовать for оператор. Просто сделайте следующее:

 methods <- c("kendall", "spearman")

    correlation <- function(x,y, methods){

      result <- list()
      for (type in methods){

        df = cor(data.frame(x,y), use="complete.obs", method=type)

        result[type] <- list(df)
      }

      return(data.frame(result) )
    }

    correlation(mtcars[1],mtcars[2],methods)
  

Комментарии:

1. Я не могу воспроизвести этот сценарий. Ошибка: неожиданный ‘,’ в «методах <- («kendall»,»… Когда я делаю это списком, он по-прежнему отвечает: «аргумент «методы» отсутствует, по умолчанию нет»

2. Исправил это, c() добавив в первую строку и передав «методы» функции, для меня это работает сейчас. Извините, забыл это адаптировать.

Ответ №2:

 # vector that has your methods
methods <- c("kendall", "spearman")

# function which loops thru the vector of functions
correlation <- function(x,y) {
    a <- lapply(X = methods, FUN = function(m,x,y){
    df1 = cor(data.frame(x,y), use="complete.obs", method= m) 
  },x=x,y=y)

  return(a)
}

res <- correlation(mtcars[1],mtcars[2])
#list to dataframe 

do.call("cbind", lapply(res, as.data.frame))
  

Результаты :

            mpg        cyl        mpg        cyl
mpg  1.0000000 -0.7953134  1.0000000 -0.9108013
cyl -0.7953134  1.0000000 -0.9108013  1.0000000
  

Спасибо!

Комментарии:

1. Ошибка в lapply(a, as.data.frame): объект ‘a’ не найден?