如何从长到宽对分类数据进行重塑和汇总?
How to reshape and summarise categorical data from long to wide?
我的数据库是这样的:
db <- data.frame(var1 = c("A", "B", "C", "D", "E"), var2 = c("X", "X", "Y", "Y", "Y"),
var3 = c("G", "H", "G", "G", "K"))
db
var1 var2 var3
A X G
B X H
C Y G
D Y G
E Y K
我想根据 var2 重塑并计算 var3 的出现次数以获得此结果:
var2 var3.G var3.H var3.K
X 1 1 0
Y 2 0 1
我尝试了转换和重塑功能,但没有成功。
tbl <- data.frame( var2 = db[,2], var3 = paste("var3", db[,3], sep = "."))
table(tbl)
var3
var2 var3.G var3.H var3.K
X 1 1 0
Y 2 0 1
xtabs 函数使用起来相当简单。唯一的认知跳跃是意识到没有 LHS,除非你想对第三个变量求和:
> xtabs( ~var2+var3, data=db)
var3
var2 G H K
X 1 1 0
Y 2 0 1
您不想对此执行 as.data.frame
,因为它会转换为长格式,但您可以对其使用 as.data.frame.matrix
,因为 R-'table' 继承自'matrix' class.
多一个选择。使用超级有用的 data.table 包:
library(data.table)
db <- data.table(var1 = c("A", "B", "C", "D", "E"), var2 = c("X", "X", "Y", "Y", "Y"),
var3 = c("G", "H", "G", "G", "K"))
dcast.data.table(db, var2 ~ var3, fun = length, value.var= 'var3')
var2 G H K
1: X 1 1 0
2: Y 2 0 1
这是另一种方法:
您可以结合使用 t() 和 table()。
db <- data.frame(var1 = c("A", "B", "C", "D", "E"),
var2 = c("X", "X", "Y", "Y", "Y"),
var3 = c("G", "H", "G", "G", "K"))
db
t(table(db$var3,db$var2))
我的数据库是这样的:
db <- data.frame(var1 = c("A", "B", "C", "D", "E"), var2 = c("X", "X", "Y", "Y", "Y"),
var3 = c("G", "H", "G", "G", "K"))
db
var1 var2 var3
A X G
B X H
C Y G
D Y G
E Y K
我想根据 var2 重塑并计算 var3 的出现次数以获得此结果:
var2 var3.G var3.H var3.K
X 1 1 0
Y 2 0 1
我尝试了转换和重塑功能,但没有成功。
tbl <- data.frame( var2 = db[,2], var3 = paste("var3", db[,3], sep = "."))
table(tbl)
var3
var2 var3.G var3.H var3.K
X 1 1 0
Y 2 0 1
xtabs 函数使用起来相当简单。唯一的认知跳跃是意识到没有 LHS,除非你想对第三个变量求和:
> xtabs( ~var2+var3, data=db)
var3
var2 G H K
X 1 1 0
Y 2 0 1
您不想对此执行 as.data.frame
,因为它会转换为长格式,但您可以对其使用 as.data.frame.matrix
,因为 R-'table' 继承自'matrix' class.
多一个选择。使用超级有用的 data.table 包:
library(data.table)
db <- data.table(var1 = c("A", "B", "C", "D", "E"), var2 = c("X", "X", "Y", "Y", "Y"),
var3 = c("G", "H", "G", "G", "K"))
dcast.data.table(db, var2 ~ var3, fun = length, value.var= 'var3')
var2 G H K
1: X 1 1 0
2: Y 2 0 1
这是另一种方法:
您可以结合使用 t() 和 table()。
db <- data.frame(var1 = c("A", "B", "C", "D", "E"),
var2 = c("X", "X", "Y", "Y", "Y"),
var3 = c("G", "H", "G", "G", "K"))
db
t(table(db$var3,db$var2))