#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’ не найден?