Странная проблема с cor.test — избавиться от [[1]], [[2]], и т.д. в результатах

#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")) и результат этой функции — a list . Вы также можете изменить функцию, чтобы она была do.call(rbind, foo) внутри

5. Потрясающе. Спасибо! Я люблю, когда узнаю что-то новое.