是否有一个类似于pandas.crosstab的R函数,生成具有命名属性的联合频率表?

时间:2019-02-19 10:13:30

标签: r 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

有没有一种方法可以一起生成频率表,但又保留命名属性?

1 个答案:

答案 0 :(得分:2)

您可以使用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]))