2011-12-01 16 views
12

Tengamos una trama de datos con cadenas largas en una sola columna:tramas de datos de impresión con cadenas largas en I

df<-data.frame(short=rnorm(10,0,1),long=replicate(10,paste(rep(sample(letters),runif(1,5,8)),collapse=""))) 

¿Cómo podría imprimir la trama de datos sin mostrar toda la cadena? Algo como esto:

 short  long 
1 0.2492880 ghtaprfv... 
2 1.0168434 zrbjxvci... 
3 0.2460422 yaghkdul... 
4 0.1741522 zuabgxpt... 
5 -1.1344230 mzhjtwcr... 
6 -0.7104683 fcbhuegt... 
7 0.2749227 aqyezhbl... 
8 -0.4395554 azecsbnk... 
9 2.2837716 lkgwzedf... 
10 0.7695538 omiewuyn... 
+1

¡Gracias por el ejemplo reproducible! –

Respuesta

7

puede redefinir el método print.data.frame, y en este uso la función substr para recortar sus vectores de caracteres a la longitud máxima deseada:

print.data.frame <- function (x, ..., maxchar=20, digits = NULL, quote = FALSE, 
    right = TRUE, row.names = TRUE) 
{ 
    x <- as.data.frame(
     lapply(x, function(xx) 
      if(is.character(xx)) substr(xx, 1, maxchar) else xx) 
) 
    base::print.data.frame(x, ..., digits=digits, quote=quote, right=right, 
     row.names=row.names) 
} 

Crear datos. Nota mi adición de stringsAsFactors=FALSE:

df <- data.frame(
    short=rnorm(10,0,1), 
    long=replicate(10,paste(rep(sample(letters),runif(1,5,8)),collapse="")), 
    stringsAsFactors=FALSE 
) 

Imprimir data.frame:

print(df, maxchar=10) 
     short  long 
1 -0.6188273 cpfhnjmeiw 
2 -0.0570548 bwcmpinedr 
3 -0.5795637 dcevnyihlj 
4 0.1977156 qzxlhvnarm 
5 -1.9551196 aiflwtkjdq 
6 -1.2429173 vlscerwhgq 
7 -0.5897045 fziogkpsyr 
8 0.4946985 pdeswloxcn 
9 0.3262543 kxlofchszd 
10 -1.8059621 wncaedpzty 
2

Esta es una manera:

within(df, { 
    long = paste(substr(long, 1, 10), "...", sep = "") 
}) 

utilizo substr para conseguir la primera parte de la cadena, que utilizo para la pasta "...". Para cambiar permanentemente los personajes en df, simplemente hacer:

df = within(df, { 
    long = paste(substr(long, 1, 10), "...", sep = "") 
}) 
0

Usos dplyr e imprime una versión modificada de la trama de datos originales (sin modificarlo). Solo acorta los valores que exceden la longitud especificada:

library(dplyr) 

print.data.frame(df %>% mutate(long = ifelse(
    nchar(long > 11), 
    paste0(substr(long, 1, 8), "..."), 
    long 
))) 
Cuestiones relacionadas