Цитата(Листопадничек @ 19.10.2014 - 20:36)

Здравствуйте, коллеги. Проблема такая: в конце работы возникла потребность выделить наиболее частые сочетания поражений. Имеется девять видов поражений, которые выявлены у определенного процента обследованных пациентов. И было бы неплохо как-то обозначить, какие именно сочетания этих поражений встречаются чаще.
ну так посчитайте сочетания, что тут трудного?
поскольку данных как всегда нет, эмулируем нашего пациента:
Код
> x<-sample(c(1,0), 9, replace=TRUE)
> x
[1] 0 0 1 0 0 1 0 0 1
все сочетания осложнений у него получаем вот так:
Код
> outer(x, x, FUN=paste0)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[2,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[3,] "10" "10" "11" "10" "10" "11" "10" "10" "11"
[4,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[5,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[6,] "10" "10" "11" "10" "10" "11" "10" "10" "11"
[7,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[8,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[9,] "10" "10" "11" "10" "10" "11" "10" "10" "11"
но нас интересуют только уникальные "над или под диагональю":
Код
> outer(x, x, FUN=paste0)[upper.tri(matrix(nrow=9, ncol=9))]
[1] "00" "01" "01" "00" "00" "10" "00" "00" "10" "00" "01" "01" "11" "01" "01"
[16] "00" "00" "10" "00" "00" "10" "00" "00" "10" "00" "00" "10" "00" "01" "01"
[31] "11" "01" "01" "11" "01" "01"
объединяем все в функцию позволяющую получить данные одного пациента:
Код
> get.probe <- function(n=9) {x<-sample(c(1,0), n, replace=TRUE); outer(x, x, FUN=paste0)[upper.tri(matrix(nrow=n, ncol=n))]}
> get.probe()
[1] "10" "11" "01" "10" "00" "10" "10" "00" "10" "00" "10" "00" "10" "00" "00"
[16] "10" "00" "10" "00" "00" "00" "11" "01" "11" "01" "01" "01" "01" "11" "01"
[31] "11" "01" "01" "01" "01" "11"
получаем группу пациентов теперь (для компактности вывода они в "столбцах"

)
Код
> replicate(10, get.probe())
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "01" "10" "11" "11" "01" "10" "00" "10" "00" "10"
[2,] "00" "10" "11" "11" "01" "10" "00" "10" "01" "11"
[3,] "10" "00" "11" "11" "11" "00" "00" "00" "01" "01"
[4,] "01" "11" "10" "10" "00" "10" "01" "10" "00" "10"
[5,] "11" "01" "10" "10" "10" "00" "01" "00" "00" "00"
[6,] "01" "01" "10" "10" "10" "00" "01" "00" "10" "10"
[7,] "01" "10" "11" "10" "00" "11" "00" "10" "01" "11"
[8,] "11" "00" "11" "10" "10" "01" "00" "00" "01" "01"
[9,] "01" "00" "11" "10" "10" "01" "00" "00" "11" "11"
[10,] "11" "10" "01" "00" "00" "01" "10" "00" "01" "01"
[11,] "00" "10" "10" "11" "00" "11" "00" "11" "01" "10"
[12,] "10" "00" "10" "11" "10" "01" "00" "01" "01" "00"
[13,] "00" "00" "10" "11" "10" "01" "00" "01" "11" "10"
[14,] "10" "10" "00" "01" "00" "01" "10" "01" "01" "00"
[15,] "10" "00" "10" "01" "00" "11" "00" "01" "11" "10"
[16,] "01" "11" "11" "10" "01" "10" "00" "11" "00" "10"
[17,] "11" "01" "11" "10" "11" "00" "00" "01" "00" "00"
[18,] "01" "01" "11" "10" "11" "00" "00" "01" "10" "10"
[19,] "11" "11" "01" "00" "01" "00" "10" "01" "00" "00"
[20,] "11" "01" "11" "00" "01" "10" "00" "01" "10" "10"
[21,] "01" "01" "01" "10" "01" "10" "00" "11" "10" "00"
[22,] "01" "10" "11" "10" "01" "10" "01" "10" "00" "10"
[23,] "11" "00" "11" "10" "11" "00" "01" "00" "00" "00"
[24,] "01" "00" "11" "10" "11" "00" "01" "00" "10" "10"
[25,] "11" "10" "01" "00" "01" "00" "11" "00" "00" "00"
[26,] "11" "00" "11" "00" "01" "10" "01" "00" "10" "10"
[27,] "01" "00" "01" "10" "01" "10" "01" "10" "10" "00"
[28,] "11" "10" "11" "00" "11" "00" "01" "10" "00" "00"
[29,] "01" "11" "10" "11" "01" "10" "01" "11" "01" "10"
[30,] "11" "01" "10" "11" "11" "00" "01" "01" "01" "00"
[31,] "01" "01" "10" "11" "11" "00" "01" "01" "11" "10"
[32,] "11" "11" "00" "01" "01" "00" "11" "01" "01" "00"
[33,] "11" "01" "10" "01" "01" "10" "01" "01" "11" "10"
[34,] "01" "01" "00" "11" "01" "10" "01" "11" "11" "00"
[35,] "11" "11" "10" "01" "11" "00" "01" "11" "01" "00"
[36,] "11" "01" "10" "01" "11" "00" "11" "01" "01" "00"
любое сочетание можно оценить применив table():
Код
> table(replicate(100, get.probe())[1,])
00 01 10 11
27 23 29 21
ну или все сочетания одновременно:
Код
> d <- replicate(100, get.probe())
> t(sapply(1:nrow(d), function(i) table(d[i,])))
00 01 10 11
[1,] 28 22 22 28
[2,] 18 32 21 29
[3,] 22 28 17 33
[4,] 26 24 29 21
[5,] 27 23 28 22
[6,] 23 16 32 29
[7,] 25 25 24 26
[8,] 26 24 23 27
[9,] 18 21 31 30
[10,] 28 27 21 24
[11,] 24 26 25 25
[12,] 23 27 26 24
[13,] 21 18 28 33
[14,] 25 30 24 21
[15,] 24 25 25 26
[16,] 23 27 29 21
[17,] 20 30 32 18
[18,] 18 21 34 27
[19,] 26 29 26 19
[20,] 22 27 30 21
[21,] 27 22 25 26
[22,] 25 25 27 23
[23,] 27 23 25 25
[24,] 20 19 32 29
[25,] 31 24 21 24
[26,] 31 18 21 30
[27,] 28 21 24 27
[28,] 25 27 27 21
[29,] 22 28 24 26
[30,] 22 28 24 26
[31,] 17 22 29 32
[32,] 24 31 22 23
[33,] 25 24 21 30
[34,] 26 23 20 31
[35,] 26 26 20 28
[36,] 25 27 21 27
когда не все уровни в таблице населены, то понадобится их "прибить" гвоздями

Код
> d <- replicate(10, get.probe())
> t(sapply(1:nrow(d), function(i) table(factor(d[i,], levels=c("00","01","10","11")))) )
00 01 10 11
[1,] 2 2 5 1
[2,] 1 3 5 1
[3,] 5 2 1 2
[4,] 0 4 3 3
[5,] 2 5 1 2
[6,] 3 3 0 4
[7,] 3 1 4 2
[8,] 6 1 1 2
[9,] 4 2 3 1
[10,] 2 1 5 2
[11,] 2 2 6 0
[12,] 6 1 2 1
[13,] 6 0 2 2
[14,] 3 0 5 2
[15,] 6 1 2 1
[16,] 2 2 1 5
[17,] 1 6 2 1
[18,] 2 4 1 3
[19,] 1 2 2 5
[20,] 2 5 1 2
[21,] 3 5 0 2
[22,] 2 2 4 2
[23,] 5 2 1 2
[24,] 3 3 3 1
[25,] 1 2 5 2
[26,] 5 2 1 2
[27,] 5 3 1 1
[28,] 1 2 5 2
[29,] 2 2 2 4
[30,] 4 3 0 3
[31,] 2 4 2 2
[32,] 0 3 4 3
[33,] 3 4 1 2
[34,] 3 5 1 1
[35,] 1 2 3 4
[36,] 3 3 1 3
как то так