Решение довольно сложное, хотя и выглядит легкой задачей. Вот решение с использованием пакета purrr
в качестве основного инструмента.
Давайте импортируем данные:
data <- structure(list(Group = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L,
3L, 3L), Category = c("B", "C", "D", "A", "B", "C", "D", "A",
"B", "C", "D"), number = c(4L, 16L, 7L, 22L, 17L, 56L, 38L, 3L,
3L, 9L, 7L), min = c(3.2, 3.2, 3.1, 6.4, 6.7, 6, 6.4, 10, 9.7,
10.6, 9.9), total = c(33L, 33L, 33L, 133L, 133L, 133L, 133L,
22L, 22L, 22L, 22L), Proportion = c(0.1212121, 0.4848485, 0.2121212,
0.1654135, 0.1278195, 0.4210526, 0.2857143, 0.1363636, 0.1363636,
0.4090909, 0.3181818)), row.names = 2:12, class = "data.frame")
и необходимые пакеты:
library(dplyr) # mutate, group_by and rowwise functions
library(tidyr) # nest
library(purrr) # map
library(combinat) # combn
Мы создадим tibble
объект foo
, который разделяет исходный набор данных на группы. Это позволяет нам отображать функции на группы.
foo <- foo %>% mutate(tab = map(data, combFun))
Теперь мы определяем собственную функцию combPval
, которая 1) создает data.frame комбинаций факторов (combTab
), 2) создает data.frame tab1
, в котором хранятся соответствующие столбцы для prop.test
. Эти data.frames объединяются на последующих этапах для создания data.frame data
. Затем prop.test
применяется способом rowwise
.
combPval <- function(group){
combTab <- combn(unique(group$Category), 2) %>% t() %>% data.frame()
tab1 <- group %>% select(Category, number, total)
combTab
temp <- merge(y=combTab, x=tab1, by.y="X2", by.x="Category" )
data <- merge(y=temp, x=tab1, by.y="X1", by.x="Category")
data <- data %>%
rowwise() %>%
mutate(
pval = prop.test(x=c(number.x, number.y), n=c(total.x, total.y))$p.val
)
data
}
Функция combPval
применяется следующим образом:
foo <- foo %>% mutate(results = map(data, combPval))
Результаты для первой группы могут быть получены:
foo$results[[1]]
# A tibble: 3 x 7
# Rowwise:
Category number.x total.x Category.y number.y total.y pval
<chr> <int> <int> <chr> <int> <int> <dbl>
1 B 4 33 C 16 33 0.00322
2 B 4 33 D 7 33 0.509
3 C 16 33 D 7 33 0.0388