R: Каковы лучшие функции для работы с конкатенацией и усреднением значений в data.frame? - PullRequest
3 голосов
/ 19 марта 2010

У меня есть data.frame из этого кода:

   my_df = data.frame("read_time" = c("2010-02-15", "2010-02-15", 
                                      "2010-02-16", "2010-02-16", 
                                       "2010-02-16", "2010-02-17"), 
                      "OD" = c(0.1, 0.2, 0.1, 0.2, 0.4, 0.5) )

, который производит это:

> my_df
   read_time  OD
1 2010-02-15 0.1
2 2010-02-15 0.2
3 2010-02-16 0.1
4 2010-02-16 0.2
5 2010-02-16 0.4
6 2010-02-17 0.5

Я хочу усреднить столбец OD для каждого отдельного времени чтения (обратите внимание, что некоторые реплицируются, а другие нет), и я также хотел бы рассчитать стандартное отклонение, создав таблицу следующим образом:

> my_df
   read_time  OD        stdev
1 2010-02-15 0.15       0.05
5 2010-02-16 0.3         0.1
6 2010-02-17 0.5         0

Какие функции лучше всего подходят для объединения таких значений в data.frame?

Ответы [ 3 ]

7 голосов
/ 19 марта 2010

Пакет plyr популярен для этого, но базовые функции by() и aggregate() также помогут.

> ddply(my_df, "read_time", function(X) data.frame(OD=mean(X$OD),stdev=sd(X$OD)))
   read_time      OD   stdev
1 2010-02-15 0.15000 0.07071
2 2010-02-16 0.23333 0.15275
3 2010-02-17 0.50000      NA

Вы можете добавить пропущенный бит для возврата 0 вместо NA для последнего std.dev.

Кроме того, вам не нужны кавычки (для переменных), которые были в конструкции data.frame.

3 голосов
/ 20 марта 2010

Вы можете попробовать пакет data.table. Если вы знаете MySQL, вам будет очень легко получить все функции, в противном случае основы тоже достаточно хороши; -)

my_dfdt<-data.table(my_df)
mean<-my_dfdt[,mean(OD), by="read_time"]
sd<-  ..  

вы также можете присоединиться как к одной строке, так и к cbind в конце, ваш вызов стиля

Еще одно преимущество: это очень быстро, если у вас большие выборки. Очень быстро ... см. Документацию почему.

1 голос
/ 19 марта 2010

Это показывает, как вы можете использовать aggregate, чтобы получить среднее значение и стандартное отклонение от вашего read_time.

>aggregate(my_df$OD, by=list(my_df$read_time), function(x) mean(x))

     Group.1         x
1 2010-02-15 0.1500000
2 2010-02-16 0.2333333
3 2010-02-17 0.5000000


>aggregate(my_df$OD, by=list(my_df$read_time), function(x) sd(x))
     Group.1          x
1 2010-02-15 0.07071068
2 2010-02-16 0.15275252
3 2010-02-17         NA
...