У меня есть книга Excel с 54 листами. Каждый лист представляет одну страну и представляет собой матрицу 17 x 11, где строки - это годы, а столбцы - экономические переменные.
Я могу перенести книгу Excel в R с помощью пакета readxl .
sheet_list <- lapply(1:54, function(i) read_excel("FDI-vs-variables.xlsx", sheet = i, na="NA"))
Мои данные теперь существуют в виде списка фреймов данных, sheet_list , где каждый фрейм данных представляет один лист моей рабочей книги.
Далее я хочу запустить корреляционный тест для двух переменных, которые мне нужны, на всех листах / фреймах данных.
Например, третий столбец во всех листах / рамках данных - это ВВП, а восьмой столбец - это процент недоедающего населения. Я могу написать функцию, которая захватывает эти соответствующие столбцы в листе / кадре данных и запускает корреляционный тест, используя эти данные.
dfCorTest <- function(df){
rslt <- cor.test(df[[3]],df[[8]], method="kendall",use="pairwise")
return(rslt)
}
Затем я использую lapply , чтобы применить эту функцию к каждому листу / фрейму данных в моем списке из 54 листов / фреймов данных.
cor_results <- lapply(sheet_list, dfCorTest)
В результате получается список списков cor_results с подробным описанием результатов 54 различных cor.test прогонов.
Как извлечь из этого списка списков только оценку корреляции (tau) и значение p?
Я знаю, что вы можете вызвать конкретные результаты cor.test , используя $estimate
и $p.value
, и я могу сделать это в списке cor_results следующим образом:
cor_results[[1]]$estimate
cor_results[[1]]$p.value
cor_results[[2]]$estimate
cor_results[[2]]$p.value
...and so on
Но как эффективно это сделать? В идеале я хотел бы иметь возможность записывать в текстовый файл, где вывод выглядит примерно так:
SheetNo Estimate P-value
1 3.33 0.054
2 -2.76 0.889
... ... ...
54 1.23 0.007
Я знаю, что подобный вопрос задавался в Как извлечь ... , но они использовали для циклов вместо lapply для запуска нескольких корреляционных тестов и я не могу понять, эквивалентный код.
ОБНОВЛЕНИЕ / РЕДАКТИРОВАНИЕ
Ответ, предложенный пользователем Parfait ниже работал (спасибо!). Исправление того, что было возвращено функцией и комбо из sapply и transpose :
dfCorTest <- function(df){
rslt <- cor.test(df[[3]], df[[8]], method="kendall", use="pairwise")
return(c(estimate = rslt$estimate,
p.value = rslt$p.value))
}
cor_results <- t(sapply(sheet_list, dfCorTest))