Я пытаюсь запустить серию точных тестов Фишера для своих данных с помощью 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'))})
Спасибо!
Я не уверен, что именно ваша цель здесь. Скорее всего, вы хотите извлечь результаты (то есть 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)
})
@Shannon Я добавил объяснение этому в ответ. По сути, результатом является просто список, у которого есть класс, который заставляет его красиво печатать, и вы можете получить доступ к необработанным данным, как к любым элементам списка.
Отлично, большое спасибо за вашу помощь!
Большое спасибо, это сработало! Я планировал просто сохранить вывод по умолчанию, но если бы я хотел извлечь p-значения в список или фрейм данных, как бы я это сделал? (извините, я все еще новичок в R!)