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

uqdfh47h  于 2023-04-03  发布在  其他
关注(0)|答案(2)|浏览(109)

我已经从HairEyeColor数据中创建了数据

HEC = as.data.frame(HairEyeColor)

这是一种快速生成具有频率列的 Dataframe 的方法,这是我的情况。
我需要创建类似于以下内容的列联表:

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解决方案是*所需的。

cigdeys3

cigdeys31#

我们通过summarise然后spread来进行分组

library(tidyerse)
HEC %>% 
    group_by(Hair, Eye) %>% 
    summarise(Freq = sum(Freq)) %>%
    spread(Eye, Freq)

它也可以在一行程序中完成

xtabs(Freq ~ Eye + Hair, HEC)
8zzbczxx

8zzbczxx2#

我们可以用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

相关问题