2011-11-03 12 views
6

A veces me gustaría pegar columnas de diferentes marcos de datos (tablas, matrices o lo que sea). Por ejemplo, tengo una tabla de medios y una tabla de desarrolladores de stan. Quiero que los dos peguen junto con el SD en un par de paréntesis para la impresión de látex. Sospecho que hay una solución plyr amigable pero no puedo pensar en cómo trabajar en dos marcos de datos (intenté almacenar los dataframes como una lista y usando ldply pero este fue mi primer intento con una función plyr de lista y se incendió.Pegar columnas de dos marcos de datos

gracias de antemano.

#========= 
#fake data 
#========= 
x<-mtcars[1:3,1:3] 
y<-mtcars[1:3,8:10] 


#========================== 
#A column pasting function 
#========================== 
meansd<-function(x, y){ 
x<-round(x, dig=2) 
y<-round(y, dig=2) 
paste(x, "(", y, ")", sep="") 
} 

Eso es por lo que yo tengo.

resultado deseado no hay nombres de las columnas necesarias. no me importa si la devolución es una matriz o trama de datos

16.46(0) 0(1) 1(4) 
17.02(0) 0(1) 1(4) 
18.61(1) 1(1) 1(4) 
+2

si está buscando usar esto para producir tablas de resumen de regresión en látex, entonces eche un vistazo a 'mtable' en el paquete' memisc'. es una función muy flexible que le permite generar su salida de regresión en múltiples formatos con un mínimo esfuerzo. – Ramnath

+0

@Ramnath Gracias por tu comentario. Me familiaricé con este paquete recientemente. Hace una gran cantidad de lo que quiero para la producción de látex, pero todavía hay algunas cosas que necesito la flexibilidad para algunas cosas que mtable no puede. –

+0

¿Va a 'xtable' el data.frame resultante? –

Respuesta

4

Aquí está su función editada para recorrer y pegar cada columna. Esto le da el resultado deseado, pero probablemente exista una forma más inteligente de hacerlo.

meansd<-function(x, y){ 
    x<-round(x, digits = 2) 
    y<-round(y, digits = 2) 
    out <- matrix(ncol = dim(x)[1], nrow = dim(x)[2]) 
    for(i in 1:dim(x)[1]) 
    { 
     out[i, ] <-paste(x[i, ], "(", y[i, ], ")", sep="") 
    } 
    return(out) 
} 
+0

Ryan gracias por su respuesta. Funciona muy bien Espero una respuesta no loop si es posible (estoy seguro de que es solo que no sé cómo). –

+0

Esta fue la primera respuesta que coincidía con mis especificaciones, por lo que le doy la respuesta aceptada. Ojalá pudiera verificar cada uno de los tres. –

7

Aquí es un método que utiliza plyr

t(ldply(1:NCOL(x), function(i) meansd(x[,i], y[,i]))) 
+0

Sabía que se podía hacer con plyr. Gracias. –

7

¿Qué tal mapply?

x <- mtcars[1:3,1:3] 
y <- mtcars[1:3,8:10] 

mypaste <- function(x,y) paste(x, "(", y, ")", sep="") 

mapply(mypaste, x,y) 

    mpg  cyl disp  
[1,] "21(0)" "6(1)" "160(4)" 
[2,] "21(0)" "6(1)" "160(4)" 
[3,] "22.8(1)" "4(1)" "108(4)" 
+0

muy elegante !!! – Ramnath

+1

Gracias! Me gustó tu solución 'ldply' también. Sabor similar, solo revuelto con un pequeño martillo Hadley. –

+0

Mi solución favorita. Gracias. Simple y hermoso. Pensamiento muy creativo –

Cuestiones relacionadas