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

是否有类似于pandas.crosstab的R函数,使用命名属性生成联合频率表?,r,crosstab,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

我想用单个变量[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

是否有一种方法可以一起生成频率表,但同时保留命名属性?

您可以使用
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]))
#选择要在表中使用的列

dta您可以使用
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]))
#选择要在表中使用的列

dta嘿Lise,你有示例数据吗?您可以使用
table()
或整洁的方法是:
library(dplyr);计数(数据1,变量)
。嘿,Lise,你有示例数据吗?您可以使用
table()
或整洁的方法是:
library(dplyr);计数(数据1,变量)
。感谢您的评论。另一个问题是,如果我想在for循环中生成所有可能的联接表,该怎么办?@Lisa Try
unlist(lappy(1:5,函数(x)combn(1:5,x,simplify=FALSE)),recursive=FALSE)
;结果可以在
for
循环中使用。@Lisa在回答中添加了一个示例感谢您的评论。另一个问题是,如果我想在for循环中生成所有可能的联接表,该怎么办?@Lisa Try
unlist(lappy(1:5,函数(x)combn(1:5,x,simplify=FALSE)),recursive=FALSE)
;结果可以在
for
循环中使用。@Lisa在答案中添加了一个示例