R: Как получить общие подсчеты (частоту) уровней двух факторных переменных по переменной ID (как новый фрейм данных)

Чтобы прояснить вопрос, позвольте мне начать с одного детского примера моего фрейма данных.

ID <- c(rep("first", 2), rep("second", 4), rep("third",1), rep("fourth", 3))
Var_1 <- c(rep("A",2), rep("B", 2), rep("A",3), rep("B", 2), "A")
Var_2 <- c(rep("C",2), rep("D",3) , rep("C",2),  rep("E",2), "D")

DF <- data.frame(ID, Var_1, Var_2)

> DF
       ID  Var_1 Var_2
1   first     A     C
2   first     A     C
3  second     B     D
4  second     B     D
5  second     A     D
6  second     A     C
7   third     A     C
8  fourth     B     E
9  fourth     B     E
10 fourth     A     D

Имеется одна факторная переменная ID и две факторные переменные Var_1 с R=2 уровнями факторов и Var_2 с C=3 уровнями факторов.

Я хотел бы получить новый фрейм данных с (RxC)+1=(2x3)+1 переменными с частотами всех комбинаций уровней факторов - отдельно для каждого уровня в переменной ID, что бы выглядело так:

      ID   A.C  A.D  A.E  B.C  B.D  B.E
1  first    2    0    0    0    0    0
2 second    1    1    0    0    2    0
3  third    1    0    0    0    0    0
4 fourth    0    1    0    0    0    2

Попробовал пару функций, но результатов и близко не было, так что о них даже не стоит упоминать. В исходном фрейме данных я должен получить (6x9)+1=55 переменных.

РЕДАКТИРОВАТЬ: Существуют решения для подсчета уровней факторов для одной или многих переменных отдельно, но я не мог понять, как сделать общий подсчет комбинаций уровней факторов для двух (или более) переменных. Реализация решения для других теперь кажется легкой, когда я получил ответы, но я не мог добраться туда сам.


person Peky84    schedule 01.02.2016    source источник
comment
^^Добавьте скобку в конце.   -  person Paweł Sopel    schedule 01.02.2016


Ответы (3)


Используя функцию dcast из пакета reshape (или data.table, который имеет расширенную реализацию функции dcast):

library(reshape2)
dcast(DF, ID ~ paste(Var_1,Var_2,sep="."), fun.aggregate = length)

который дает:

      ID A.C A.D B.D B.E
1  first   2   0   0   0
2 fourth   0   1   0   2
3 second   1   1   2   0
4  third   1   0   0   0
person Jaap    schedule 01.02.2016
comment
Лучшее решение моей проблемы здесь, потому что оно напрямую связано с фреймом данных. - person Peky84; 01.02.2016
comment
Спасибо. Но я должен упомянуть, что метод @StevenBeaupré также вернет фрейм данных. - person Jaap; 01.02.2016
comment
Правда, я пропустил это. Прости, Стивен Бопре. Однако его метод кажется более индивидуальным, что очень приятно и даже лучше, если вы сами пришли к ответу. Я все еще предпочитаю ваше предложение, потому что это часто используемая функция. - person Peky84; 01.02.2016

Мы могли бы использовать paste для создания переменной, объединяющей Var_1 и Var_2, а затем создать таблицу непредвиденных обстоятельств с идентификатором и новой переменной:

table(DF$ID,paste(DF$Var_1,DF$Var_2,sep="."))

выход

         A.C A.D B.D B.E
  first    2   0   0   0
  fourth   0   1   0   2
  second   1   1   2   0
  third    1   0   0   0

Чтобы упорядочить строки таблицы, нам нужно было бы factor(DF$ID,levels=c("first","second","third","fourth")) заранее.

person scoa    schedule 01.02.2016

Пытаться

library(tidyr)
library(dplyr)

DF %>%
  unite(Var, Var_1, Var_2, sep = ".") %>%
  count(ID, Var) %>%
  spread(Var, n, fill = 0)

Который дает:

#Source: local data frame [4 x 5]
#
#      ID   A.C   A.D   B.D   B.E
#  (fctr) (dbl) (dbl) (dbl) (dbl)
#1  first     2     0     0     0
#2 fourth     0     1     0     2
#3 second     1     1     2     0
#4  third     1     0     0     0
person Steven Beaupré    schedule 01.02.2016