2013-05-20 5 views
0

У меня есть кадр данных:кадра данных в матрицу без изменения формы

set.seed(1234) 
mydata <- data.frame(d1=strsplit("AAABBCCCCCDD", "")[[1]], 
d2=rnorm(12), d3=c("aba", "bbc", "ccb", "aba", "bbc", "ccb", "aba", "aba", "ccb", "bbc", "aba", "bbc"), 
d4=c(101:103, 201:202, 301:305, 401:402)) 

и я хочу матрицу d1 на d3, содержащей сумму каждого d3 в каждом d1.

Я мог бы использовать пакет reshape, но проблема в том, что я использую R 3.0, и нет версии изменения для него.

Любое предложение? Приветствия!

+0

Какую вещь вы суммируете? d2 и d4 оба являются числовыми ... – Frank

+0

Не могли бы вы использовать пакет 'reshape2', который заменил' reshape'? – Gregor

+1

Um, reshape отлично работает в R 3.0.0 – hadley

ответ

2

Во-первых, изменение формы (и reshape2) отлично работает с R 3.0. Во-вторых, я предполагаю, что вы суммируете d2, а не d3. Вы можете использовать для этого plyr.

require(plyr) 
ddply(mydata, .(d1), summarise, d2=sum(d2)) 
+0

да, извините! Я суммирую d2! Думаю, у меня проблемы с моей версией R! – AEM

2

Это делает то, что вам нужно. Просто переключите d2 на d4.

tapply(mydata$d2,mydata[,c("d1","d3")],sum) 

В результате ...

d3 
d1   aba  bbc   ccb 
    A -1.2070657 0.2774292 1.08444118 
    B -2.3456977 0.4291247   NA 
    C -1.1213718 -0.8900378 -0.05839611 
    D -0.4771927 -0.9983864   NA 
+0

Ваши ответы и @ Ананда действительно работали! Но это не матрица, ни кадр данных! Если я попробую as.data.frame, он вернется в прежнее состояние! – AEM

+0

Я вижу 'is.matrix (tapply (mydata $ d2, mydata [, c (" d1 "," d3 ")], sum))' подходит как 'TRUE' (и то же самое для решения Ananda Mahto) , Может быть, вы имеете в виду что-то другое по «матрице», чем стандартное значение R ...? – Frank

+0

@ user2335669, если я использую 'as.data.frame' в ответ Фрэнка, я получаю' data.frame'. Чтобы получить «data.frame» из моего ответа, вы должны использовать 'as.data.frame.matrix' вместо' as.data.frame'. – A5C1D2H2I1M1N2O1R2T1

2

Как уже отмечался, ваш вопрос не ясен. Если вы заинтересованы только в sum как функции агрегации, то вы можете просто использовать xtabs:

> xtabs(d2 ~ d1 + d3, mydata) 
    d3 
d1   aba   bbc   ccb 
    A -1.20706575 0.27742924 1.08444118 
    B -2.34569770 0.42912469 0.00000000 
    C -1.12137182 -0.89003783 -0.05839611 
    D -0.47719270 -0.99838644 0.00000000 

Чтобы вернуться к data.frame, обернуть всю вещь в as.data.frame.matrix (не только as.data.frame):

> as.data.frame.matrix(xtabs(d2 ~ d1 + d3, mydata)) 
     aba  bbc   ccb 
A -1.2070657 0.2774292 1.08444118 
B -2.3456977 0.4291247 0.00000000 
C -1.1213718 -0.8900378 -0.05839611 
D -0.4771927 -0.9983864 0.00000000