Использование kable для разбиения строки символа на несколько столбцов - PullRequest
1 голос
/ 23 сентября 2019

У меня есть некоторые данные, подобные следующим:

data.frame(col = rownames(mtcars))

Что выглядит следующим образом:

                   col
1            Mazda RX4
2        Mazda RX4 Wag
3           Datsun 710
4       Hornet 4 Drive
5    Hornet Sportabout
6              Valiant
7           Duster 360
8            Merc 240D
9             Merc 230
10            Merc 280
11           Merc 280C
12          Merc 450SE
13          Merc 450SL
14         Merc 450SLC
15  Cadillac Fleetwood
16 Lincoln Continental
17   Chrysler Imperial
18            Fiat 128
19         Honda Civic
20      Toyota Corolla
21       Toyota Corona
22    Dodge Challenger
23         AMC Javelin
24          Camaro Z28
25    Pontiac Firebird
26           Fiat X1-9
27       Porsche 914-2
28        Lotus Europa
29      Ford Pantera L
30        Ferrari Dino
31       Maserati Bora
32          Volvo 142E

Однако, когда я запускаю документ уценки R, данные занимают многостр.

Как получить данные для печати в формате kable, чтобы они разбивались на несколько столбцов?У меня есть нечетное число наблюдений.

Ожидаемый результат (без команд kable)

1            Mazda RX4     15  Cadillac Fleetwood    29      Ford Pantera L
2        Mazda RX4 Wag     16 Lincoln Continental    30        Ferrari Dino
3           Datsun 710     17   Chrysler Imperial    31       Maserati Bora
4       Hornet 4 Drive     18            Fiat 128    32          Volvo 142E
5    Hornet Sportabout     19         Honda Civic  
6              Valiant     20      Toyota Corolla
7           Duster 360     21       Toyota Corona
8            Merc 240D     22    Dodge Challenger
9             Merc 230     23         AMC Javelin
10            Merc 280     24          Camaro Z28
11           Merc 280C     25    Pontiac Firebird
12          Merc 450SE     26           Fiat X1-9
13          Merc 450SL     27       Porsche 914-2
14         Merc 450SLC     28        Lotus Europa

Текущий код:

library(knitr)
library(kableExtra)
data.frame(col = rownames(mtcars)) %>%
  kable() %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Мы можем использовать split с gl.Укажите количество строк, на которое нужно разделить, и это создаст индекс группировки (1:14 -> 1-я группа, 15->, следующая группа и т. Д.)

library(dplyr)
data.frame(col = rownames(mtcars)) %>%
        split(as.integer(gl(nrow(.), 14, nrow(.)))) 
0 голосов
/ 23 сентября 2019

Вот функция, которая будет принимать data.frame и n_cols в качестве входных данных, где n_cols - это количество столбцов, которые вы хотите вернуть, и разбить data.frame соответственно.Ключевым моментом является то, что он заполнит необходимые строки в любых неровных столбцах NA значениями

df.split_to_cols <- function(df = NULL, n_cols = 3){
  if(!is.data.frame(df)){
    return("Need a data frame")
  }else {
    n_splits <- ceiling(nrow(df) / n_cols)
    # Start indexes
    start_n <- seq(1, nrow(df), by = n_splits)
    # lead and subtract 1 from the start_n and include the total number of rows
    end_n <- c(dplyr::lead(start_n, 1, NULL) - 1, nrow(df))

    df_parts <- Map(function(x, y, n_col){
      df_part <- df[seq(x, y, by = 1), 1]
      if(length(df_part) < n_splits){
        rep_new <- n_splits - length(df_part)
        df_part <- c(df_part, rep(NA, rep_new))
      }
      set_col <- sprintf("col_%s", n_col)
      new_d <- data.frame(df_part)
      colnames(new_d) <- set_col
      new_d
    }, x = start_n, y = end_n, n_col = 1:length(start_n))
    as.data.frame(df_parts)
  }
}


df <- data.frame(cols = row.names(mtcars))

> df.split_to_cols(df, n_cols = 2)
                 col_1             col_2
1            Mazda RX4 Chrysler Imperial
2        Mazda RX4 Wag          Fiat 128
3           Datsun 710       Honda Civic
4       Hornet 4 Drive    Toyota Corolla
5    Hornet Sportabout     Toyota Corona
6              Valiant  Dodge Challenger
7           Duster 360       AMC Javelin
8            Merc 240D        Camaro Z28
9             Merc 230  Pontiac Firebird
10            Merc 280         Fiat X1-9
11           Merc 280C     Porsche 914-2
12          Merc 450SE      Lotus Europa
13          Merc 450SL    Ford Pantera L
14         Merc 450SLC      Ferrari Dino
15  Cadillac Fleetwood     Maserati Bora
16 Lincoln Continental        Volvo 142E




> df.split_to_cols(df, n_cols = 5)
              col_1       col_2               col_3            col_4          col_5
1         Mazda RX4   Merc 240D  Cadillac Fleetwood Dodge Challenger Ford Pantera L
2     Mazda RX4 Wag    Merc 230 Lincoln Continental      AMC Javelin   Ferrari Dino
3        Datsun 710    Merc 280   Chrysler Imperial       Camaro Z28  Maserati Bora
4    Hornet 4 Drive   Merc 280C            Fiat 128 Pontiac Firebird     Volvo 142E
5 Hornet Sportabout  Merc 450SE         Honda Civic        Fiat X1-9           <NA>
6           Valiant  Merc 450SL      Toyota Corolla    Porsche 914-2           <NA>
7        Duster 360 Merc 450SLC       Toyota Corona     Lotus Europa           <NA>



> df.split_to_cols(df, n_cols = 7) %>% knitr::kable()


|col_1             |col_2      |col_3              |col_4               |col_5            |col_6          |col_7         |
|:-----------------|:----------|:------------------|:-------------------|:----------------|:--------------|:-------------|
|Mazda RX4         |Valiant    |Merc 280C          |Lincoln Continental |Toyota Corona    |Fiat X1-9      |Maserati Bora |
|Mazda RX4 Wag     |Duster 360 |Merc 450SE         |Chrysler Imperial   |Dodge Challenger |Porsche 914-2  |Volvo 142E    |
|Datsun 710        |Merc 240D  |Merc 450SL         |Fiat 128            |AMC Javelin      |Lotus Europa   |NA            |
|Hornet 4 Drive    |Merc 230   |Merc 450SLC        |Honda Civic         |Camaro Z28       |Ford Pantera L |NA            |
|Hornet Sportabout |Merc 280   |Cadillac Fleetwood |Toyota Corolla      |Pontiac Firebird |Ferrari Dino   |NA            |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...