Как создать таблицы соответствия (перекрестные таблицы) в R для подмножества столбцов с категориальными данными? - PullRequest
2 голосов
/ 19 августа 2010

У меня есть таблица, заголовок которой выглядит так (я упростил ее):

id, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10

где каждая строка, кроме идентификатора, является категориальной переменной. Назовем категории A, B, C, D, E.

Я хотел бы создать таблицу сопряженности для некоторых столбцов, например, приведенных ниже (для краткости я не поместил номера образцов в ячейки). Получить общий столбец / строку было бы здорово, но не обязательно, я могу вычислить это позже.

      a1  a2  a3  a4 Total
    ----------------------
    A|
    B|
    C|
    D|
    E|
Total|

Таким образом, вопрос заключается в том, как создать кросс-таблицу на основе нескольких столбцов в R? Примеры, которые я видел с table () и xtabs (), используют только столбец. В моем случае столбцы являются смежными, поэтому одна кросс-таблица суммирует столбцы a1..a4, другой a5..a7 и так далее. Я надеюсь, что есть элегантный способ сделать это.

Я программист, но новичок в R.

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 19 августа 2010

Для этого ваши данные плохо отформатированы. Вот один из подходов к правильному изменению формы данных с помощью пакета reshape.

library(reshape)
data.m <- melt(data, id = "id")

Чтобы вычислить таблицу для всех уровней с полями, вы можете использовать

cast(data.m, value ~ variable, margins = T)

Для подмножества возьмите соответствующий поднабор data.m.

3 голосов
/ 19 августа 2010

Вот как это сделать, используя базовые команды R. Вам не нужен цикл for, если каждый столбец имеет одинаковые уровни факторов, но цикл будет хорошим отказоустойчивым.

> set.seed(21)
> df <- data.frame(
+   id=1:20,
+   a1=sample(letters[1:4],20,TRUE),
+   a2=sample(letters[1:5],20,TRUE),
+   a3=sample(letters[2:5],20,TRUE),
+   a4=sample(letters[1:5],20,TRUE),
+   a5=sample(letters[1:5],20,TRUE),
+   a6=sample(letters[1:5],20,TRUE) )
> 
> for(i in 2:NCOL(df)) {
+   levels(df[,i]) <- list(a="a",b="b",c="c",d="d",e="e")
+ }
> 
> addmargins(mapply(table,df[,-1]))
    a1 a2 a3 a4 a5 a6 Sum
a    6  2  0  2  5  3  18
b    3  3  7  2  1  3  19
c    5  3  1  6  5  3  23
d    6  8  6  1  5  3  29
e    0  4  6  9  4  8  31
Sum 20 20 20 20 20 20 120
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...