Как я могу сделать вывод из tapply () в data.frame - PullRequest
19 голосов
/ 11 апреля 2010

У меня есть data.frame в R, который выглядит так:

      score    rms  template   aln_id       description
1  -261.410  4.951 2f22A.pdb  2F22A_1 S_00001_0000002_0
2  -231.987 21.813 1wb9A.pdb  1WB9A_4 S_00002_0000002_0
3  -263.722  4.903 2f22A.pdb  2F22A_3 S_00003_0000002_0
4  -269.681 17.732 1wbbA.pdb  1WBBA_6 S_00004_0000002_0
5  -258.621 19.098 1rxqA.pdb  1RXQA_3 S_00005_0000002_0
6  -246.805  6.889 1rxqA.pdb 1RXQA_15 S_00006_0000002_0
7  -281.300 16.262 1wbdA.pdb 1WBDA_11 S_00007_0000002_0
8  -271.666  4.193 2f22A.pdb  2F22A_2 S_00008_0000002_0
9  -277.964 13.066 1wb9A.pdb  1WB9A_5 S_00009_0000002_0
10 -261.024 17.153 1yy9A.pdb  1YY9A_2 S_00001_0000003_0

Я могу рассчитать сводную статистику по data.frame следующим образом:

> tapply( d$score, d$template, mean )
1rxqA.pdb 1wb9A.pdb 1wbbA.pdb 1wbdA.pdb 1yy9A.pdb 2f22A.pdb 
-252.7130 -254.9755 -269.6810 -281.3000 -261.0240 -265.5993 

Есть ли простой способ вернуть этот вывод обратно в data.frame? Я бы хотел, чтобы в нем были две колонки:

d$template
mean

Я люблю tapply, но сейчас я вырезаю и вставляю результаты из tapply в текстовый файл и немного взламываю его, чтобы получить необходимую мне сводную статистику с соответствующими именами. Это очень неправильно, и я хотел бы сделать что-то лучше!

Ответы [ 3 ]

26 голосов
/ 11 апреля 2010

Существует много различных способов преобразования вывода из вызова tapply в data.frame.

Но гораздо проще избежать вызова tapply и заменить его вызовом аналогичной функции, которая возвращает кадр данных вместо вектора:

более конкретно:

  • tapply возвращает вектор

  • агрегат возвращает фрейм данных

, поэтому просто измените свой вызов функции с tapply на агрегат , вот так:

data(iris)     # in 'datasets' just call 'data' and pass in 'iris' as an argument

tx = tapply(iris$Sepal.Length, list(iris$Species), mean)
# returns: versicolor  virginica 
             5.94       6.59 

class(tx)
# returns: vector

tx = aggregate(iris$Sepal.length, list(iris$Species), mean)
# returns:
         Group.1    x
     1 versicolor 5.94
     2  virginica 6.59


class(tx)
# returns: data.frame
14 голосов
/ 11 апреля 2010

Вы можете попробовать это:

mn <- tapply(d$score,d$template,mean)
df <- data.frame(template=names(mn),mean=mn)
8 голосов
/ 11 апреля 2010
library(plyr)
ddply(d, "template", summarise, mean = mean(score))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...