studio org mac itam cran_mirrors r statistics

org - r studio



¿Cómo puedo hacer que la salida de tapply() en un data.frame (3)

Tengo un data.frame en R que se parece a esto:

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

Puedo calcular estadísticas de resumen en el data.frame de esta manera:

> 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

¿Hay una manera fácil de forzar esta salida de nuevo en un data.frame? Me gustaría que tuviera estas dos columnas:

d$template mean

Me encanta tapply, pero en este momento estoy cortando y pegando los resultados de tapply en un archivo de texto y hackeando un poco para obtener las estadísticas de resumen que quiero con los nombres apropiados. Esto se siente muy mal, y me gustaría hacer algo mejor!


Hay muchas formas diferentes de transformar la salida de una llamada de tapply en un data.frame.

Pero es mucho más sencillo evitar la llamada a tapply en primer lugar y sustituirla por una llamada a una función similar que devuelve un marco de datos en lugar de un vector:

más específicamente:

  • tapply devuelve un vector

  • agregado devuelve un marco de datos

así que simplemente cambie su llamada de función de tapply a agregada , de esta manera:

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


Puedes probar esto:

mn <- tapply(d$score,d$template,mean) df <- data.frame(template=names(mn),mean=mn)


library(plyr) ddply(d, "template", summarise, mean = mean(score))