Создание таблицы () отсчетов с использованием частотного столбца - PullRequest
2 голосов
/ 09 апреля 2019

У меня есть данные, созданные из 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 ]

5 голосов
/ 09 апреля 2019

Мы делаем группу путем суммирования, а затем spread

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

Это также может быть сделано в одну строку

xtabs(Freq ~ Eye + Hair, HEC)
2 голосов
/ 09 апреля 2019

Мы можем сделать это с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...