Как отредактировать имя данных в выводе при использовании lapply для точного теста Фишера в R?

Я пытаюсь запустить серию точных тестов Фишера для своих данных с помощью lapply и хочу знать, есть ли способ указать имя данных в выходных данных.

Это мой текущий код:

vars <- c('xvar1', 'xvar2', 'xvar3')
lapply(vars, function(i) {fisher.test(dataframe[[i]], dataframe$yvar)})

Это создает вывод, который я ищу, но имя данных в выводе - «dataframe[[i]] and dataframe$yvar». Есть ли способ заставить это сказать «dataframe $ xvar1 и dataframe $ yvar» вместо этого?

Я знаю, что при запуске хи-квадратов с ctables вы можете сделать это, используя аргумент dnn (пример ниже), но не нашел эквивалентного аргумента для теста Фишера.

ctables <- lapply(vars, function(i) {ctable(dataframe[[i]], dataframe$yvar, chisq=T, useNA='no', dnn=c(i,'yvar'))})

Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, что именно ваша цель здесь. Скорее всего, вы хотите извлечь результаты (то есть p-значения) из объекта результата теста Фишера и работать с ними как со списком или фреймом данных.

Для этого загляните в справку: ?fisher.test. Если вы прокрутите вниз до раздела «Значение», вы увидите, что на самом деле он возвращает список. Хотя у него есть специальный класс, который заставляет его распечатывать особым образом, это все еще список, и мы можем обращаться к элементам списка по имени, как и в любом другом списке.

x <- fisher.test(iris$Petal.Length, iris$Sepal.Width, simulate.p.value = T)
x$p.value
[1] 0.04797601

В вашем случае, если вы просто хотите получить список p.values, вы просто извлекаете его из объекта в функции применения:

# To get a list of p.values
lapply(vars, function(i) {
    res <- fisher.test(dataframe[[i]], dataframe$yvar)
    return(res$p.value)
})

# To get a full data frame
tbl <- lapply(vars, function(i) {
    res <- fisher.test(dataframe[[i]], dataframe$yvar)
    df <- data.frame(var = i,
                     p = res$p.value)
    return(df)
})

# Convert to data.frame in baseR
as.data.frame(t(sapply(tbl, rbind)))

# Convert to data.frame in tidyverse
dplyr::bind_rows(tbl)

Если вы действительно хотите сохранить вывод по умолчанию, просто с показанным исправленным значением data, вы можете вручную отредактировать объект результата:

x <- fisher.test(iris$Petal.Length, iris$Sepal.Width, simulate.p.value = T)
x

    Fisher's Exact Test for Count Data with simulated p-value
    (based on 2000 replicates)

data:  iris$Petal.Length and iris$Sepal.Width
p-value = 0.04798
alternative hypothesis: two.sided

Как видите, значение данных основано на том, что мы поместили в тест. Однако мы можем изменить это на все, что захотим, и он покажет этот вывод при печати по умолчанию:

x$data.name <- 'cat'
x

    Fisher's Exact Test for Count Data with simulated p-value
    (based on 2000 replicates)

data:  cat
p-value = 0.04798
alternative hypothesis: two.sided

В вашем конкретном примере ваш код будет выглядеть примерно так:

lapply(vars, function(i) {
    res <- fisher.test(dataframe[[i]], dataframe$yvar)
    res$data.name <- paste0("dataframe$", i, " and dataframe$yvar")
    return(res)
})

Большое спасибо, это сработало! Я планировал просто сохранить вывод по умолчанию, но если бы я хотел извлечь p-значения в список или фрейм данных, как бы я это сделал? (извините, я все еще новичок в R!)

Shannon 17.03.2022 19:35

@Shannon Я добавил объяснение этому в ответ. По сути, результатом является просто список, у которого есть класс, который заставляет его красиво печатать, и вы можете получить доступ к необработанным данным, как к любым элементам списка.

divibisan 17.03.2022 20:07

Отлично, большое спасибо за вашу помощь!

Shannon 17.03.2022 20:28

Другие вопросы по теме