Как напечатать длинный фрейм данных, разбитый на несколько частей, расположенных рядом - PullRequest
0 голосов
/ 02 октября 2018

Этот вопрос является вариантом " Как напечатать длинный столбец из кадра данных, разделенного на два столбца рядом ", на который, к сожалению, не было ответа.
У меня есть кадр данных с несколькими столбцамии много строк, которые я хотел бы напечатать на одной странице.Следующий пример - только начало моего набора данных.

structure(list(depnais = c("01", "02", "03", "04", "05", "06", 
"07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", 
"18", "19", "21", "22", "23"), n = c(4051L, 5163L, 3323L, 
1176L, 1394L, 12624L, 2623L, 2194L, 1227L, 3266L, 3111L, 2528L, 
26737L, 7105L, 1096L, 3194L, 5173L, 2592L, 2323L, 5993L, 4952L, 
571L)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-23L), .Names = c("depnais", "n"))

Я хотел бы вывести его содержимое в виде:

#   depnais     n depnais      n depnais      n depnais      n depnais      n depnais     n 
# 1 01       4051 02        5163 03        3323 04        1176 05        1394 06       12624
# 2 07       2623 08        2194 09        1227 10        3266 11        3111 12        2528
# 3 13      26737 14        7105 15        1096 16        3194 17        5173 18        2592
# 4 19       2323 21        5993 22        4952 23         571

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

df %>% group_by(depnais) %>% summarise(n=n()) %>% 
  filter(depnais<'96') %>%
  bind_cols(data.frame(g=rep(1:6,16))) %>%
  replyr::replyr_split("g") %>%
  purrr::reduce(bind_cols) %>% select(-matches("^g"))

И я печатаю две данныеотдельно кадры.

Но на самом деле мне не нужны два кадра данных, которые я делаю из оригинального.Итак: есть ли способ напрямую напечатать фрейм данных, просто указав, сколько частей разделения должно быть?

1 Ответ

0 голосов
/ 04 января 2019

В воплощении dcast() можно изменить несколько столбцов одновременно.С последующим переупорядочением и переименованием столбцов это может быть использовано для преобразования data.frame со многими строками в широкий формат.

Первый порядок строк

в соответствии с запросом OP:

library(data.table)
# specify number of splits
n_splits <- 6
# reshape to wide format
wide <- as.data.table(df)[, rn := rep(1:.N, each = n_splits, length.out = .N)][
  , dcast(.SD, rn ~ rowid(rn), as.character, value.var = colnames(df), fill = "")][
    , rn := NULL][]
# reorder columns
setcolorder(wide, as.vector(outer(colnames(df), 1:n_splits, paste, sep = "_")))
# rename columns
setnames(wide, rep(colnames(df), n_splits))
wide
   depnais     n depnais    n depnais    n depnais    n depnais    n depnais     n
1:      01  4051      02 5163      03 3323      04 1176      05 1394      06 12624
2:      07  2623      08 2194      09 1227      10 3266      11 3111      12  2528
3:      13 26737      14 7105      15 1096      16 3194      17 5173      18  2592
4:      19  2323      21 5993      22 4952      23  571

Обратите внимание, что результат транспонируется в соответствии с запросом OP, например, строки с 1 по 6 из df печатаются горизонтально по первой строке разделения ( первый ряд строк) .

Неполные строки в разбиении обрабатываются автоматически.Все столбцы приводятся к символу, а пропущенные значения заполняются "".


Это будет работать и для других разбиений, например, n_splits <- 4:

   depnais     n depnais     n depnais    n depnais    n
1:      01  4051      02  5163      03 3323      04 1176
2:      05  1394      06 12624      07 2623      08 2194
3:      09  1227      10  3266      11 3111      12 2528
4:      13 26737      14  7105      15 1096      16 3194
5:      17  5173      18  2592      19 2323      21 5993
6:      22  4952      23   571

Первый порядок столбцов

Для полноты первого порядка столбцов можно добиться с небольшими изменениями при создании rn:

library(data.table)
# specify number of splits
n_splits <- 6
# reshape to wide format, fill by column (column first order)
wide <- as.data.table(df)[, rn := rep(1:ceiling(.N/n_splits), length.out = .N)][][
  , dcast(.SD, rn ~ rowid(rn), as.character, value.var = colnames(df), fill = "")][
    , rn := NULL][]
# reorder columns
setcolorder(wide, as.vector(outer(colnames(df), 1:n_splits, paste, sep = "_")))
# rename columns
setnames(wide, rep(colnames(df), n_splits))
wide
   depnais    n depnais     n depnais    n depnais     n depnais    n depnais    n
1:      01 4051      05  1394      09 1227      13 26737      17 5173      22 4952
2:      02 5163      06 12624      10 3266      14  7105      18 2592      23  571
3:      03 3323      07  2623      11 3111      15  1096      19 2323             
4:      04 1176      08  2194      12 2528      16  3194      21 5993

Данные

Данные, первоначально предоставленные OP, возвратили предупреждение поврежденный фрейм данных .Это исправлено:

df <- structure(list(depnais = c("01", "02", "03", "04", "05", "06", 
"07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", 
"18", "19", "21", "22", "23"), n = c(4051L, 5163L, 3323L, 1176L, 
1394L, 12624L, 2623L, 2194L, 1227L, 3266L, 3111L, 2528L, 26737L, 
7105L, 1096L, 3194L, 5173L, 2592L, 2323L, 5993L, 4952L, 571L)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -22L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...