2013-05-02 6 views
3

Я новичок в R. Извинения, если вопросы слишком глупы.Сумма в таблице кросс

У меня есть таблица входных данных образца следующим образом.

Column-1 Column-2 Column-3 
FF  FF  2 
NN  NN  5 
FF  FF  2 
NN  NN  1 
FN  FF  3 

Выход должен быть

 FF FN NF NN 
    FF 4 0 0 0 
    FN 3 0 0 0 
    NF 0 0 0 0 
    NN 0 0 0 6 

Я использовал табличную функцию(), но это дает только "количество", а не "сумма". Цените любую помощь!

ответ

4

С малоизвестной xtabs функция. Ваши данные:

l <- c("FF", "FN", "NF", "NN") 

data <- data.frame(
    Column1 = factor(c("FF", "NN", "FF", "NN", "FN"), levels = l), 
    Column2 = factor(c("FF", "NN", "FF", "NN", "FF"), levels = l), 
    Column3 = c(2, 5, 2, 1, 3)) 

xtabs(Column3 ~ ., data) 
#  Column2 
# Column1 FF FN NF NN 
#  FF 4 0 0 0 
#  FN 3 0 0 0 
#  NF 0 0 0 0 
#  NN 0 0 0 6 

Выход является table, но вы можете обернуть его в as.matrix получить matrix.

+0

+1 намного проще, и приятно видеть 'xtabs' в действии. – juba

2

Вы можете использовать функцию daply из plyr:

R> daply(mydf, .(Column.1, Column.2), summarize, sum(Column.3)) 
     Column.2 
Column.1 FF NN 
     FF 4 NULL 
     FN 3 NULL 
     NN NULL 6 

А вот решение с основанием R:

res <- with(mydf, 
    by(Column.3, list(Column.1, Column.2), FUN=sum)) 
res <- as.table(res) 
res[is.na(res)] <- 0 

Что дает:

FF NN 
FF 4 0 
FN 3 0 
NN 0 6 
+0

Благодарим вас за быстрый ответ. Прекрасно работает! – user961932