2015-01-09 2 views
0

Моя база данных, как это:Как изменить и обобщить категориальные данные от длинного до широкого?

db <- data.frame(var1 = c("A", "B", "C", "D", "E"), var2 = c("X", "X", "Y", "Y", "Y"), 
      var3 = c("G", "H", "G", "G", "K")) 
db 

    var1 var2 var3 
    A X G 
    B X H 
    C Y G 
    D Y G 
    E Y K 

Я хотел бы изменить в основе var2 и подсчета вхождений var3, чтобы получить этот результат:

var2 var3.G var3.H var3.K 
    X 1  1  0 
    Y 2  0  1 

Я попытался бросание и функции изменения не имеют успеха.

ответ

3

Функция xtabs достаточно проста в использовании. Только когнитивный скачок, чтобы понять, что нет LHS, если вы не хотите, чтобы сделать суммирование третьей переменной:

> xtabs(~var2+var3, data=db) 
    var3 
var2 G H K 
    X 1 1 0 
    Y 2 0 1 

Вы не хотите делать as.data.frame на это, так как он будет конвертировать в длинной форме, но вы можете используйте на нем as.data.frame.matrix, так как R-«таблица» наследуется от класса «matrix».

+0

Более элегантное решение! Я просто подожду, чтобы проверить это. –

+0

Мне не нужна проверка, и у RStudent был несколько более полный ответ. –

2
tbl <- data.frame(var2 = db[,2], var3 = paste("var3", db[,3], sep = ".")) 
table(tbl) 
    var3 
var2 var3.G var3.H var3.K 
    X  1  1  0 
    Y  2  0  1 
+0

Очень умное решение! Я просто добавлю: 'tbl <- as.data.frame.matrix (table (tbl))'. –

+0

Спасибо! Если вы это сделаете, результат будет выглядеть совсем по-другому ... – DatamineR

+0

Да ... первый colum стал rownames –

2

Еще один вариант. Использование супер полезный data.table пакет:

library(data.table) 

db <- data.table(var1 = c("A", "B", "C", "D", "E"), var2 = c("X", "X", "Y", "Y", "Y"), 
      var3 = c("G", "H", "G", "G", "K")) 

dcast.data.table(db, var2 ~ var3, fun = length, value.var= 'var3') 
    var2 G H K 
1: X 1 1 0 
2: Y 2 0 1 
0

Вот еще один способ идти о нем:

Вы можете использовать комбинацию т() и таблицы().

db <- data.frame(var1 = c("A", "B", "C", "D", "E"), 
       var2 = c("X", "X", "Y", "Y", "Y"), 
       var3 = c("G", "H", "G", "G", "K")) 
db 

t(table(db$var3,db$var2)) 
Смежные вопросы