таблица сопряженности парных факторов / категориальных переменных из фрейма данных с более чем 2 столбцами - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть фрейм данных с несколькими столбцами категориальных ковариат.Я пытаюсь сгенерировать n выбрать 2 таблицы,

table(df[[1]],df[[2]]) table(df[[1]],df[[3]]) ... table(df[[n-1]],df[[n]])

Я попытался использовать external как outer(df,df,table), но я получаю сообщение об ошибке, которое, я уверен, состоит в том, что он будет использовать одинарные скобкивместо двойных скобок.

Я также пытался использовать combn(df,2), но он теряет имена факторов.

Должен ли я просто использовать петли?Я был против этого в пользу векторизации, но если она будет одинаково эффективной, то этого будет достаточно.

Я должен упомянуть, что я также пытался xtabs(~., df), но я думаю, что это сгенерировало не только таблицы, но и тысячи таблиц предельных вероятностей.

Любая помощь, связанная с векторизацией, или эти функции будутполезно

РЕДАКТИРОВАТЬ: мне удалось сделать это с помощью xtabs и с помощью as.formula, вставив имена переменных i-й и j-й в формулу, разделенную символом «+» во вложенном цикле for.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Неэффективность циклов не должна беспокоить, поскольку циклы не будут большими.Однако семейство функций apply одновременно и выразительно, и удобно, поэтому стоит задуматься.Это избавляет от необходимости предварительно выделять структуры данных для результата и избегает громоздкого двойного цикла.

Я проиллюстрирую это с помощью набора игрушечных данных, делая один шаг за раз.Давайте создадим фрейм данных df с тремя столбцами с именами «x», «y» и «z»:

> n <- 1:5; (df <- as.data.frame(cbind(x=n, y=n*10, z=n*100)))

  x  y   z
1 1 10 100
2 2 20 200
3 3 30 300
4 4 40 400
5 5 50 500

Массив различных пар имен df легко создается с помощью combn, как предлагается в вопросе:

> combn(names(df), 2)

     [,1] [,2] [,3]
[1,] "x"  "x"  "y" 
[2,] "y"  "z"  "z"

Вы можете использовать каждый столбец для индексации по столбцам df:

> apply(combn(names(df), 2), 2, function(i) df[i])

[[1]]
  x  y
1 1 10
2 2 20
3 3 30
4 4 40
5 5 50

[[2]]
  x   z
1 1 100
2 2 200
3 3 300
4 4 400
5 5 500

[[3]]
   y   z
1 10 100
2 20 200
3 30 300
4 40 400
5 50 500

Результатом является список фреймов данныхкаждый с соответствующим образом названными столбцами.Поэтому вы можете вызвать lapply для генерации таблиц.Вот полное решение.Выдает список таблиц.

>  lapply(apply(combn(names(df), 2), 2, function(i) df[i]), table)

[[1]]
   y
x   10 20 30 40 50
  1  1  0  0  0  0
  2  0  1  0  0  0
  3  0  0  1  0  0
  4  0  0  0  1  0
  5  0  0  0  0  1

[[2]]
   z
x   100 200 300 400 500
  1   1   0   0   0   0
  2   0   1   0   0   0
  3   0   0   1   0   0
  4   0   0   0   1   0
  5   0   0   0   0   1

[[3]]
    z
y    100 200 300 400 500
  10   1   0   0   0   0
  20   0   1   0   0   0
  30   0   0   1   0   0
  40   0   0   0   1   0
  50   0   0   0   0   1
0 голосов
/ 19 ноября 2018

Вы можете легко сделать это с помощью волшебства FP, используя функцию Map, например:

Map(function(n) table(a[[n[1]]], a[[n[2]]]), combn(colnames(a), 2, simplify = FALSE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...