我已经根据HairEyeColor
数据创建了数据
HEC = as.data.frame(HairEyeColor)
这是使用“频率”列生成数据帧的快速方法,这是我的情况。
我需要创建类似于以下内容的列联表:
colhair
coleye black blond brunette red
blue 20 94 84 17
brown 68 7 119 26
green 5 16 29 14
hazel 15 10 54 14
注意:我不是在问如何使用现有的HairEyeColor数据表,而是要使用具有频率列的数据帧。
我尝试了table()
,xtabs()
和aggregate()的几种变体,而我能做的最好的就是获取行数。我似乎无法有效地使用频率列。
plyr解决方案是 所不希望的。
答案 0 :(得分:5)
我们按摘要分组,然后spread
library(tidyerse)
HEC %>%
group_by(Hair, Eye) %>%
summarise(Freq = sum(Freq)) %>%
spread(Eye, Freq)
也可以单线完成
xtabs(Freq ~ Eye + Hair, HEC)
答案 1 :(得分:2)
我们可以使用tapply()
来做到这一点:
tapply(HEC$Freq, list(ColHair=HEC$Hair,ColEye=HEC$Eye), sum)
# ColEye
# ColHair Brown Blue Hazel Green
# Black 68 20 15 5
# Brown 119 84 54 29
# Red 26 17 14 14
# Blond 7 94 10 16
或使用data.table
软件包:
library(data.table)
setDT(HEC)[,list(Freq=sum(Freq)),by=list(Hair, Eye)]
# Hair Eye Freq
# 1: Black Brown 68
# 2: Brown Brown 119
# 3: Red Brown 26
# 4: Blond Brown 7
# 5: Black Blue 20
# 6: Brown Blue 84
# 7: Red Blue 17
# 8: Blond Blue 94
# 9: Black Hazel 15
# 10: Brown Hazel 54
# 11: Red Hazel 14
# 12: Blond Hazel 10
# 13: Black Green 5
# 14: Brown Green 29
# 15: Red Green 14
# 16: Blond Green 16
以交叉表格式获取它:
HEC_tab <- dcast(setDT(HEC)[,list(Freq=sum(Freq)),by=list(Hair, Eye)],
Hair~Eye, value.var = "Freq")
setnames(HEC_tab , c("HairCol/EyeCol", names(HEC_tab)[-1]))
HEC_tab
# HairCol/EyeCol Brown Blue Hazel Green
# 1: Black 68 20 15 5
# 2: Brown 119 84 54 29
# 3: Red 26 17 14 14
# 4: Blond 7 94 10 16