Как агрегировать категориальные данные в R? - PullRequest
7 голосов
/ 02 апреля 2019

У меня есть фрейм данных, который состоит из двух столбцов с категориальными переменными (Better, Similar, Worse).Я хотел бы придумать таблицу, которая подсчитывает, сколько раз эти категории появляются в двух столбцах.Я использую следующий фрейм данных:

       Category.x  Category.y
1      Better      Better
2      Better      Better
3      Similar     Similar
4      Worse       Similar

Я бы хотел создать такую ​​таблицу:

           Category.x    Category.y
Better     2             2
Similar    1             2
Worse      1             0

Как бы вы поступили?

Ответы [ 3 ]

7 голосов
/ 02 апреля 2019

Как упоминалось в комментариях, table является стандартным для этого, например

table(stack(DT))

         ind
values    Category.x Category.y
  Better           2          2
  Similar          1          2
  Worse            1          0

или

table(value = unlist(DT), cat = names(DT)[col(DT)])

         cat
value     Category.x Category.y
  Better           2          2
  Similar          1          2
  Worse            1          0

или

with(reshape(DT, direction = "long", varying = 1:2), 
  table(value = Category, cat = time)
)

         cat
value     x y
  Better  2 2
  Similar 1 2
  Worse   1 0
3 голосов
/ 02 апреля 2019
sapply(df1, function(x) sapply(unique(unlist(df1)), function(y) sum(y == x)))
#        Category.x Category.y
#Better           2          2
#Similar          1          2
#Worse            1          0
2 голосов
/ 02 апреля 2019

Одна dplyr и tidyr возможность может быть:

df %>%
 gather(var, val) %>%
 count(var, val) %>%
 spread(var, n, fill = 0)

  val     Category.x Category.y
  <chr>        <dbl>      <dbl>
1 Better           2          2
2 Similar          1          2
3 Worse            1          0

Во-первых, он преобразует данные из широкоформатного формата в длинный, причем столбец «var» содержит имена переменных, а столбец «val» - соответствующие значения. Во-вторых, он рассчитывает на «var» и «val». Наконец, он распространяет данные в желаемый формат.

Или с dplyr и reshape2 вы можете сделать:

df %>%
 mutate(rowid = row_number()) %>%
 melt(., id.vars = "rowid") %>%
 count(variable, value) %>%
 dcast(value ~ variable, value.var = "n", fill = 0)

    value Category.x Category.y
1  Better          2          2
2 Similar          1          2
3   Worse          1          0
...