Подтвердить что ты не робот

Печать данных с длинными строками в R

Пусть у нас есть кадр данных с длинными строками в одном столбце:

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

Как я могу напечатать dataframe, не показывая всю строку? Что-то вроде этого:

        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...
4b9b3361

Ответ 1

Вы можете переопределить метод 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 = "")
})

Ответ 3

Использует dplyr и выводит измененную версию исходного фрейма данных (без его изменения). Только сокращает значения, превышающие указанную длину:

library(dplyr)

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