Создание рукописного вывода в виде таблицы из результатов частоты и пропорций нескольких переменных - PullRequest
0 голосов
/ 04 августа 2020

Мне было интересно, можно ли создать таблицу (т.е. таблицы, обычно используемые в рукописи) из значений частот и пропорций нескольких переменных.

Я экспериментировал с этим набором данных и кодами:

data("mtcars")
head(mtcars)

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

attach(mtcars)

Теперь я создаю несколько таблиц, используя категориальные переменные этого набора данных. Сначала я использую am переменную из mtcars набора данных.

t1 = table (am)
t1

am
0   1
19  13

p1 = round(prop.table(t1),3)*100
p1

am
   0     1
59.4  40.6

Точно так же я создаю несколько таблиц с частотами и пропорциями с другими переменными, т.е. vs, gear carb . Ниже приведены коды:

t2 = table(vs)
t2
p2 = round(prop.table(t2),3)*100
p2

t3 = table(gear)
t3
p3 = round(prop.table(t3),3)*100
p3

t4 = table(carb)
t4
p4 = round(prop.table(t4),3)*100
p4

Теперь я хочу создать таблицу, похожую на вывод из R, как это изображение:

enter image description here

The actual outcome with the values from the above-mentioned codes by me is here in this picture:

введите описание изображения здесь

Я пробовал использовать функции rbind() и cbind(). Но не мог управлять правильными кодами. Ваша помощь очень ценится.

1 Ответ

2 голосов
/ 04 августа 2020

Если вы не против использования дополнительных пакетов, вы можете проверить summarytools (https://github.com/dcomtois/summarytools).

Вот пример (обычно отображается как html , но я сохранил изображение PNG для демонстрационных целей):

suppressPackageStartupMessages(invisible(
    lapply(c("summarytools", "dplyr", "kableExtra"),
           require, character.only = TRUE)))
dfs <- dfSummary(mtcars[, c("am", "vs", "gear", "carb")], 
  round.digits = 3,
  varnumbers = FALSE,
  valid.col = FALSE, 
  na.col = FALSE, 
  graph.col = FALSE,
  style = "grid",
  tmp.img.dir = "/tmp",
  method = "grid") %>% 
  mutate(`Stats / Values` = NULL) #%>% view() to view the html output
print(dfs, method = 'render') %>% as_image(file="out1.png")
image

Created on 2020-08-04 by the пакет репекс (v0.3.0)

Редактировать

Если вы настаиваете на создании собственных таблиц (и, возможно, их экспорте в Word), есть одна проблема с вашей предложенной таблицей: в R столбцы могут иметь только один класс, поэтому вам придется принудительно принудительно использовать как минимум переменную ' 'столбец к символам. Это также повлияет на выравнивание и не будет выглядеть так красиво.

Также есть одна проблема с rbind - имена столбцов должны совпадать.

Хотя есть несколько способов, как это сделать Чтобы обойти эти проблемы, может быть проще выбрать другой подход.

Существует несколько пакетов, которые позволяют создавать таблицы html, например flextable, huxtable, kableExtra, но AFAIK, вам нужно будет объединить их впоследствии, например, используя Rmarkdown или скопировав их один за другим и вставив в Word, который сохранит форматирование.

Ниже представлен один из возможных подходов с использованием Rmarkdown. Вам нужно будет сохранить приведенный ниже код как файл Rmd и связать его, что легко сделать в Rstudio (просто откройте файл Rmd и нажмите кнопку knit). Это сгенерирует файл html в том же каталоге, что и файл Rmd, который содержит ваши таблицы.

---
  output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
```

```{r results='asis', echo=FALSE}
suppressPackageStartupMessages(invisible(
  lapply(c("dplyr", "knitr", "kableExtra"),
         require, character.only = TRUE)))

makeTable <- function(x, df=mtcars){
  df %>%
    count(!!enquo(x)) %>%
    mutate(prop = scales::percent(prop.table(n/n()), accuracy = .01))
}

# generate the individual data.frames
res <- list(makeTable(am), 
            makeTable(vs),
            makeTable(gear), 
            makeTable(carb))

for (i in res) {
  print(kable_styling(
    kable(i, format = "html", align = "c", row.names = FALSE), 
    full_width = FALSE))
}
```

...