Применить функцию к фрейму данных, включая оператор rbind - PullRequest
1 голос
/ 22 апреля 2020

Я ищу самый быстрый способ применить fisher.test, используя четыре столбца в очень большом фрейме данных

Ниже приведен пример теста с использованием медленного для l oop.

Применить будет быстрее, но я не могу понять, как использовать rbind в функции применения.

Также приветствуются более быстрые предложения.

testdf<-data.frame(a=c(80,1,3,4),b=c(100,200,300,400),c=c(1,2,3,4),d=c(200,250,350,450))

for (i in 1:nrow(testdf)){
  testdf$e[i] <- fisher.test(rbind(c(testdf$a[i],testdf$b[i]),c(testdf$c[i],testdf$d[i])))$p.value
}

Большое спасибо за вашу помощь

Ответы [ 3 ]

1 голос
/ 22 апреля 2020

Вы можете попытаться привести строку в матрицу:

apply(testdf,1,function(i)fisher.test(matrix(i,ncol=2))$p.value)

Как заметил @Chuck, для проверки точно такой же матрицы должно быть значение byrow = TRUE. Я выбрал ярлык, потому что с помощью fisher.test вы проверяете связь между строками и столбцами. Пока диагонали не поменялись местами, вы получите одно и то же значение p и отношение шансов

Если ваша матрица действительно большая, есть несколько способов, один из которых - получить уникальные значения в матрице и вычислить эти значения

Другой способ - вычислить значение pvalue напрямую , но это работает только для одностороннего теста.

0 голосов
/ 24 апреля 2020

А так как rowwise имеет статус "опросить" , здесь приведено решение с помощью dplyr и purrr. См. Мой комментарий выше, что в этом случае для сравнения 10 000 строк все 3 занимают очень похожее количество времени.

library(dplyr)
library(purrr)
testdf<-data.frame(a=c(80,1,3,4,80),b=c(100,200,300,400,100),c=c(1,2,3,4,1),d=c(200,250,350,450,200))
testdf <- 
  testdf %>%
  distinct %>%
  mutate(e = pmap_dbl(.l = list(a, b, c, d),
                      .f = ~ fisher.test(matrix(c(..1, ..2, ..3, ..4),
                                                ncol = 2,
                                                byrow = TRUE)
                                         )$p.value
                      )
          )

Создано в 2020-04-24 пакетом Представить (v0.3.0)

0 голосов
/ 23 апреля 2020

Вот решение tidyverse с использованием dplyr::rowwise. Я использовал как ваш первоначальный синтаксис, так и матричное предложение @ StupidWolf. В вашем очень маленьком наборе данных он выглядит примерно вдвое быстрее.

Создано в 2020-04-23 пакетом

Представить (v0.3.0)
...