ddply возвращает слишком много результатов

По какой-то причине я получаю больше результатов, чем ожидал, после обновления до R-2.13.0 - и обновления до plyr_1.5.1.tar.gz... Я попробовал это на старой версии plyr (версия неизвестна, к сожалению, поскольку Я просто перезаписал...)

library(plyr)
dd <-data.frame(matrix(rnorm(216),72,3),c(rep("A",24),rep("B",24),
  rep("C",24)),c(rep("J",36),rep("K",36)))
colnames(dd) <- c("v1", "v2", "v3", "dim1", "dim2")

results1 <- ddply(dd, c("dim1","dim2"), function(df) c(m1=mean(df$v1)) )
results2 <- ddply(dd, c("dim1","dim2"), function(df) { c(m1=mean(df$v1),
    m2=mean(df$v2)) } )
results3 <- ddply(dd, c("dim1","dim2"), function(df) { c(m1=mean(df$v1),
    m2=mean(df$v2), m3=mean(df$v3)) } )

Я не понимаю, почему в результатах 2 количество строк в два раза больше, чем в результатах 1, а в результатах 3 — в три раза больше, тогда как исходные результаты 1 просто реплицируются дважды или трижды.

У меня была удобная копия R версии 2.11.0 с исправлениями (2010-05-01 r51907) с использованием старой версии plyr, результаты, которых я ожидал, были...

> results1
  dim1 dim2          m1
1    A    J  0.07312783
2    B    J -0.22428746
3    B    K -0.44205832
4    C    K  0.21421456
> results2
  dim1 dim2          m1         m2
1    A    J  0.07312783 -0.1130148
2    B    J -0.22428746  0.4394832
3    B    K -0.44205832 -0.1934018
4    C    K  0.21421456 -0.0178809
> results3
  dim1 dim2          m1         m2          m3
1    A    J  0.07312783 -0.1130148 -0.03175873
2    B    J -0.22428746  0.4394832  0.21581696
3    B    K -0.44205832 -0.1934018 -0.28313530
4    C    K  0.21421456 -0.0178809 -0.21948430

Результаты, которые я получаю от версии R 2.13.0 (2011-04-13)

> results1
  dim1 dim2         m1
1    A    J -0.2270726
2    B    J  0.5860493
3    B    K -0.5986129
4    C    K  0.3135809
> results2
  dim1 dim2         m1          m2
1    A    J -0.2270726 -0.19037813
2    B    J  0.5860493 -0.05385395
3    B    K -0.5986129  0.29404095
4    C    K  0.3135809 -0.26744010
5    A    J -0.2270726 -0.19037813
6    B    J  0.5860493 -0.05385395
7    B    K -0.5986129  0.29404095
8    C    K  0.3135809 -0.26744010
> results3
   dim1 dim2         m1          m2          m3
1     A    J -0.2270726 -0.19037813 -0.20448734
2     B    J  0.5860493 -0.05385395 -0.11190857
3     B    K -0.5986129  0.29404095 -0.27072101
4     C    K  0.3135809 -0.26744010 -0.03184949
5     A    J -0.2270726 -0.19037813 -0.20448734
6     B    J  0.5860493 -0.05385395 -0.11190857
7     B    K -0.5986129  0.29404095 -0.27072101
8     C    K  0.3135809 -0.26744010 -0.03184949
9     A    J -0.2270726 -0.19037813 -0.20448734
10    B    J  0.5860493 -0.05385395 -0.11190857
11    B    K -0.5986129  0.29404095 -0.27072101
12    C    K  0.3135809 -0.26744010 -0.03184949

почему результаты2 получили 8 строк вместо 4, а результаты3 получили 12 строк вместо 4?

Спасибо, Шон


person Sean    schedule 15.04.2011    source источник


Ответы (2)


Это будет исправлено в ближайшее время в plyr 1.5.2

person hadley    schedule 15.04.2011
comment
корректно работает в версии 1.4.1, если кто-то еще только что обновил все: cran.r-project.org/src/contrib/Archive/plyr/plyr_1.4.1.tar.gz - person Jeffrey Breen; 17.04.2011

Это функция c() внутри вашего ddply(), которая вызывает проблему.

Вот три альтернативных способа написания выписки для результатов3, которые постепенно упрощаются:

  1. Используйте data.frame внутри вашей функции:

    ddply(dd, c("dim1","dim2"), function(df) {data.frame(m1=mean(df$v1), m2=mean(df$v2), m3=mean(df$v3)) } )

  2. Используйте резюме:

    ddply(dd, .(dim1, dim2), summarise, m1=mean(v1), m2=mean(v2), m3=mean(v3))

  3. Используйте numcolwise.

    ddply(dd, .(dim1, dim2), numcolwise(mean))

В каждом случае результаты такие, какие вы ожидаете:

  dim1 dim2          m1         m2          m3
1    A    J -0.04272659 -0.1468376  0.17902942
2    B    J -0.10133503 -0.1427358 -0.05241214
3    B    K  0.29698847 -0.0989732  0.14422812
4    C    K  0.04108324  0.2014864 -0.15893221
person Andrie    schedule 15.04.2011