2017-02-02 11 views
2

У меня есть кадр данных со столбцами категориальных данных, поставляемых в виде строк. Категории для каждого столбца одинаковы, например:Таблица столбцов для фрейма данных

myDF=data.frame(col1=sample(c("a","b","c"),10,replace=T), 
       col2=sample(c("a","b","c"),10,replace=T), 
       col3=sample(c("a","b","c"),10,replace=T)) 

Я хотел бы создать таблицу подсчетов в каждой категории по столбцу.

Когда все столбцы имеют все категории включены, это может быть сделано с apply использованием функции table, например:

> myDF 
    col1 col2 col3 
1  a c a 
2  b b b 
3  a a b 
4  b b a 
5  c c a 
6  a a a 
7  a c c 
8  a a c 
9  c a a 
10 a a b 
> apply(myDF,2,table) 
    col1 col2 col3 
a 6 5 5 
b 2 2 3 
c 2 3 2 

Однако, если один столбец отсутствуют некоторые категории, это не работает, потому что table не знает, какие категории следует ожидать:

myDF=data.frame(col1=sample(c("a","b","c"),10,replace=T), 
       col2=sample(c("a","b","c"),10,replace=T), 
       col3=sample(c("a","b"),10,replace=T)) 

дает:

> myDF 
    col1 col2 col3 
1  c a a 
2  a a b 
3  b a a 
4  c c a 
5  c a a 
6  c c a 
7  c b a 
8  c b b 
9  a a a 
10 b b a 
> apply(myDF,2,table)  
$col1 

a b c 
2 2 6 

$col2 

a b c 
5 3 2 

$col3 

a b 
8 2 

Как создать таблицу, которая выглядит как первая, с 0 для любых отсутствующих категорий?

+0

См. Также что-то вроде 'table (stack (lapply (myDF, as.character)))' –

ответ

2

Вы можете собрать все уровни факторов и использовать их в apply:

#get the levels from the whole data.frame 
all_levels <- levels(unlist(myDF)) 

#convert each column to factor using the levels from above 
#and then use table (which will return a zero for any missing levels) 
apply(myDF, 2, function(x) table(factor(x, levels = all_levels))) 

Выход:

col1 col2 col3 
a 1 4 7 
b 5 2 3 
c 4 4 0 

> myDF 
    col1 col2 col3 
1  b a a 
2  c b a 
3  c c b 
4  b a b 
5  b c a 
6  c c a 
7  c b a 
8  b a b 
9  a c a 
10 b a a 
+0

Отлично работает на примере. Для реальных данных столбцы еще не были привязаны к факторам, но я смог успешно использовать тот же подход с 'unique' вместо' levels'. – user1521655

+0

Звучит здорово! Рад был помочь :) – LyzandeR

1

Мы можем использовать mtabulate

library(qdapTools) 
t(mtabulate(myDF)) 
# col1 col2 col3 
#a 2 5 8 
#b 2 3 2 
#c 6 2 0 

Он работает для обоих случаев упомянутых в сообщении ОП

 Смежные вопросы

  • Нет связанных вопросов^_^