#r #function #correlation
#r #функция #корреляция
Вопрос:
У меня есть следующая функция, написанная для выполнения попарной корреляции между одной переменной со списком заданных переменных.
myCortest <- function(dat, mainVar, varlist) {
foo <- lapply(varlist, function(x){
foo1 <- cor.test(get(mainVar, as.environment(dat)),
get(x, as.environment(dat)))
data.frame(var1 = mainVar, var2 = x,
R = foo1$estimate, p = foo1$p.value)
})
foo
}
Это работает, вроде как. Результаты имеют странные [[1]], [[2]] между ними, например, следующим образом:
myCortest(chol, "wt", c("age", "chol", "tg", "ht"))
[[1]]
var1 var2 R p
cor wt age 0.6660014 5.631448e-26
[[2]]
var1 var2 R p
cor wt chol 0.06076105 0.404971
[[3]]
var1 var2 R p
cor wt tg 0.294617 3.688497e-05
[[4]]
var1 var2 R p
cor wt ht 0.8558331 2.705222e-56
Кажется, я не могу понять, что вызывает увеличение чисел в скобках. Я хотел бы избавиться от них. Есть идеи?
Ответ №1:
Это list
вывод путем зацикливания с lapply
( lapply
всегда возвращает a list
). Мы можем rbind
list
поместить элементы в один набор данных с do.call
out1 <- do.call(rbind, out)
где
out <- myCortest(chol, "wt", c("age", "chol", "tg", "ht"))
Лучшим вариантом является изменение функции ‘myCortest’ для возврата rbind
выходных данных ed
myCortest <- function(dat, mainVar, varlist) {
foo <- lapply(varlist, function(x){
foo1 <- cor.test(get(mainVar, as.environment(dat)),
get(x, as.environment(dat)))
data.frame(var1 = mainVar, var2 = x,
R = foo1$estimate, p = foo1$p.value)
})
do.call(rbind, foo)
}
Комментарии:
1. Где я разместил out1 <- do.call(rbind, out)?
2. @fiverings84 тот самый
out <- myCortest(yourdata, yourvar, varList)
3. Я не уверен, что это сработает. Я просто добавил часть в исходный вопрос. Я должен вызвать функцию следующим образом: myCortest(chol, «wt», c(«age», «chol», «tg», «ht»)) … кажется, не понимаю, как do.call(rbind, out) позволит это. Извините… это что-то новое для меня.
4. @fiverings84 ваш
out <- myCortest(chol, "wt", c("age", "chol", "tg", "ht"))
и результат этой функции — alist
. Вы также можете изменить функцию, чтобы она былаdo.call(rbind, foo)
внутри5. Потрясающе. Спасибо! Я люблю, когда узнаю что-то новое.