2011-12-01 3 views
12

はのは1列に長い文字列を持つデータフレームを持ってみましょう:印刷データフレーム

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

これは、1つの方法です。私は「...」のためのペーストを使用するよりも、

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