使用频率列创建计数表()

时间:2019-04-09 15:35:15

标签: r

我已经根据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()的几种变体,而我能做的最好的就是获取行数。我似乎无法有效地使用频率列。

解决方案是 所不希望的。

2 个答案:

答案 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