我想用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'
任何帮助表示赞赏!
答案 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)
你会得到类似的东西: