Skomplikowana zmiana kształtu

Chcę zmienić kształt mojej ramki danych z formatu długiego na szeroki i tracę pewne dane, które chciałbym zachować. W następującym przykładzie:

df <- data.frame(Par1 = unlist(strsplit("AABBCCC","")),
                 Par2 = unlist(strsplit("DDEEFFF","")),
                 ParD = unlist(strsplit("foo,bar,baz,qux,bla,xyz,meh",",")),
                 Type = unlist(strsplit("pre,post,pre,post,pre,post,post",",")),
                 Val = c(10,20,30,40,50,60,70))

   #     Par1 Par2 ParD Type Val
   #   1    A    D  foo  pre  10
   #   2    A    D  bar post  20
   #   3    B    E  baz  pre  30
   #   4    B    E  qux post  40
   #   5    C    F  bla  pre  50
   #   6    C    F  xyz post  60
   #   7    C    F  meh post  70

dfw <- dcast(df,
             formula = Par1 + Par2 ~ Type,
             value.var = "Val",
             fun.aggregate = mean)

 #     Par1 Par2 post pre
 #   1    A    D   20  10
 #   2    B    E   40  30
 #   3    C    F   65  50

to jest prawie to, czego potrzebuję, ale chciałbym mieć

niektóre dane z polaParD pole (na przykład jako pojedynczy ciąg scalony),liczba obserwacji użytych do agregacji.

tj. chciałbym, aby wynikowa ramka danych wyglądała następująco:

    #     Par1 Par2 post pre Num.pre Num.post ParD
    #   1    A    D   20  10      1      1    foo_bar 
    #   2    B    E   40  30      1      1    baz_qux
    #   3    C    F   65  50      1      2    bla_xyz_meh

Byłbym wdzięczny za wszelkie pomysły. Na przykład próbowałem rozwiązać drugie zadanie pisząc w dcast:fun.aggregate=function(x) c(Val=mean(x),Num=length(x)) - ale powoduje to błąd.

questionAnswers(8)

yourAnswerToTheQuestion