2011-12-01 24 views
12

让我们长串的数据帧中的一列:打印dataframes与R中长串

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

我怎么能打印数据框,而不显示整个字符串? 事情是这样的:

 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

感谢您的可重复的例子! –

回答

7

您可以重新定义print.data.frame方法,并在此功能中使用substr修剪你的特征向量所需的最大长度:

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) 
} 

创建数据。注意我添加stringsAsFactors=FALSE

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

打印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

这是一种方式:

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

我用SUBSTR得到字符串的第一部分,比我用糊为“...”。要永久改变DF的人物,简单地做:

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

用途dplyr,并打印出原始数据帧的修改版本(不改变的话)。只缩短超过指定长度的值:

library(dplyr) 

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