R:尝试创建交叉(频率)表时出现错误消息

时间:2015-09-18 21:09:50

标签: r csv crosstab

我想用R

创建一个交叉表

我有一个包含以下信息的csv文件:

Client_ID    Buying_Category
   123          A
   123          B 
   567          A
   567          C
   ...

我将csv加载到R

data <- read.csv ("file", header = TRUE)

现在我想创建一个交叉表

所以它看起来像这个

       A    B   C
A      2    1   1
B      1    1   0
C      1    0   1

我试过这个

crosstable <- data %>% group_by(Client_ID, Buying_Category) %>% summarize(records = sign(n()))

但是得到这个错误:

Error in UseMethod("group_by_") : no applicable method for 'group_by_' applied to an object of class "function"

所以我试过这个

with(data, tapply(PRODUCT, list(Client_ID, Buying_Category), FUN = function(x) length(unique(x))))

并收到此错误:

Error in eval(substitute(expr), data, enclos = parent.frame()) : invalid 'envir' argument of type 'closure'

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

此过程使用dplyr(数据操作)和tidyr(数据重塑)。

dt = read.table(text="
Client_ID    Buying_Category
123          A
123          B 
567          A
567          C", header=T)

library(dplyr)
library(tidyr)

dt %>% 
  group_by(Client_ID) %>%                  # for each client
  do(expand.grid(.$Buying_Category,        # create pariwise combinations of categories  
                 .$Buying_Category)) %>%
  count(Var1, Var2) %>%                    # count how many times you have each combination
  spread(Var2,n, fill=0)                   # reshape to get your table


# Source: local data frame [3 x 4]
# 
#      Var1     A     B     C
#    (fctr) (dbl) (dbl) (dbl)
# 1      A     2     1     1
# 2      B     1     1     0
# 3      C     1     0     1

根据您的最新评论,我将提供有关如何处理您要创建的图表的更多信息。 我将创建最简单的版本作为示例:

dt %>% 
  group_by(Client_ID) %>%                  # for each client
  do(expand.grid(.$Buying_Category,        # create pariwise combinations of categories  
                 .$Buying_Category)) %>%
  count(Var1, Var2) -> dt_circ             

无需重新整形,因为您可以使用dt_circ

这种格式
#     Var1   Var2     n
#   (fctr) (fctr) (int)
# 1      A      A     2
# 2      A      B     1
# 3      A      C     1
# 4      B      A     1
# 5      B      B     1
# 6      C      A     1
# 7      C      C     1

如果以下函数理解Var1为“from”,Var2为“to”,则n为“value”。

library(circlize)

chordDiagram(dt_circ)

你会得到类似的东西:

enter image description here