Есть ли функция R, похожая на pandas.crosstab, генерирующая совместную таблицу частот с именованными атрибутами?

Я хотел бы итеративно создать таблицу частот с одной переменной [var1, Y] или [var2, Y] и совместными переменными [var1, var2, Y]

Коды ниже в R могут составлять только единую таблицу частот и совместную таблицу частот по отдельности.

c1 <- ftable(variable[[1]], data1[,3])
#     Fund
# 
# b    21
# c   206
# d  1127

c1 <- ftable(variable[[3]], data1[,3])   
#     x.2   a   b   c   d
# x.1                    
# b         0   9   4   8
# c         0 116  51  39
# d         5 542 291 289

#variable[[3]] is a joint variable of variable[[1]] and variable[[2]]

as.matrix(as.vector(t(c1))) 
#       [,1]
# [1,]    0
# [2,]    9
# [3,]    4
# [4,]    8
# [5,]    0
# [6,]  116
# [7,]   51
# [8,]   39
# [9,]    5
# [10,]  542
# [11,]  291
# [12,]  289


ftable(variable[[1]], variable[[2]], data1[,3])
#       Fund
# 
# b a     0
# b       9
# c       4
# d       8
# c a     0
# b     116
# c      51
# d      39
# d a     5
# b     542
# c     291
# d     289

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


person Lisa    schedule 19.02.2019    source источник
comment
Эй, Лиза, у тебя есть примеры данных? Вы можете либо использовать table(), либо аккуратный подход: library(dplyr); count(data1, variable) .   -  person Stephan    schedule 19.02.2019


Ответы (1)


Вы можете использовать addmargins для добавления полей (суммы строк и столбцов) в таблицу.

Например:

data(mtcars)

addmargins(table(mtcars[c("cyl", "gear")]))
#      gear
# cyl    3  4  5 Sum
#   4    1  8  2  11
#   6    2  4  1   7
#   8   12  0  2  14
#   Sum 15 12  5  32

ftable(addmargins(table(mtcars[c("cyl", "gear", "carb")])))
#          carb  1  2  3  4  6  8 Sum
# cyl gear                           
# 4   3          1  0  0  0  0  0   1
#     4          4  4  0  0  0  0   8
#     5          0  2  0  0  0  0   2
#     Sum        5  6  0  0  0  0  11
# 6   3          2  0  0  0  0  0   2
#     4          0  0  0  4  0  0   4
#     5          0  0  0  0  1  0   1
#     Sum        2  0  0  4  1  0   7
# 8   3          0  4  3  5  0  0  12
#     4          0  0  0  0  0  0   0
#     5          0  0  0  1  0  1   2
#     Sum        0  4  3  6  0  1  14
# Sum 3          3  4  3  5  0  0  15
#     4          4  4  0  4  0  0  12
#     5          0  2  0  1  1  1   5
#     Sum        7 10  3 10  1  1  32

Сначала я использую table для создания таблицы, так как addmargins ожидает вывод table, а не ftable. В случае трехмерной таблицы я, наконец, использую ftable для форматирования таблицы в более читаемом формате.

Создание всех возможных таблиц

# Select columns interesting to use in table
dta <- mtcars[c("cyl", "vs", "am", "gear", "carb")]

# Generate all possible combinations of columns
combinations <- unlist(lapply(1:ncol(dta), 
  function(x) combn(1:ncol(dta), x, simplify = FALSE)), recursive = FALSE)

# For each combination calculate a table
tables <- lapply(combinations, function(cols) ftable(dta[cols]))
person Jan van der Laan    schedule 19.02.2019
comment
Спасибо за комментарий. Еще один вопрос: что, если я хочу создать всю возможную совместную таблицу в цикле for? - person Lisa; 19.02.2019
comment
@Лиза Попробуй unlist(lapply(1:5, function(x) combn(1:5, x, simplify = FALSE)), recursive = FALSE); результат можно использовать в цикле for. - person Jan van der Laan; 20.02.2019
comment
@Lisa добавила пример в ответ - person Jan van der Laan; 20.02.2019