× Need help learning R? Enroll in Applied Epi's intro R course, try our free R tutorials, post in our Community Q&A forum, or ask about our R Help Desk service.

29 Sunum için tablolar

Bu sayfa, flextable paketi ile özet veri çerçevelerinin sunuma hazır tablolara nasıl dönüştürüleceğini göstermektedir. Bu tablolar powerpoint slaytlarına, HTML sayfalarına, PDF veya Word belgelerine vb. eklenebilir.

flextable’ı kullanmadan önce, özet tablosunu veri çerçevesi olarak oluşturmanız gerekmektedir. Tablolar, çapraz tablolar, özetler ve açıklayıcı istatistiklerin hesaplanması gibi Tanımlayıcı tablolar ve [Özetleme verileri] sayfalarındaki yöntemleri kullanabilirsiniz. Veri çerçevesine uygulanan flextable daha sonraki sunumlara uygulanabilir.

Tablo oluşturmak için kullanılabilecek birçok R paketi vardır - bu sayfada flextable’ı vurgulamak istedik. knitr paketini ve onun kable() fonksiyonunu kullanan bir örnek Temaslı takibi sayfasında bulunabilir. Benzer şekilde, DT paketi [Shiny Gösterge Tabloları] sayfasında vurgulanmıştır. GT ve huxtable gibi diğerleri Önerilen paketler sayfasında bahsedilmiştir.

29.1 Hazırlık

Paketleri yükleme

flextable’ı kurun ve yükleyin. Bu el kitabında, paketi kuran ve kullanım için yükleyen pacman’dan p_load() kullanacağız. R tabanından library() içeren paketleri de yükleyebilirsiniz. R paketleri hakkında daha fazla bilgi için [R temelleri] sayfasına bakabilirsiniz.

pacman::p_load(
  rio,            # içe/dışa aktar
  here,           # dosya yolağı
  flextable,      # HTML tablosu oluştur 
  officer,        # tablolar için yardımcı fonksiyonlar
  tidyverse)      # veri yönetimi, özetlemesi ve görselleştirilmesi

Verileri içe aktarma

Başlamak için, simüle edilmiş bir Ebola salgınından temizlenmiş vaka listesini içe aktarıyoruz. Takip etmek isterseniz, “temiz satır listesi” dosyasını indirmek için tıklayın. (.rds dosyası olarak). rio paketinden import() fonksiyonuyla verileri içe aktarın (.xlsx, .csv, .rds gibi birçok dosya türünü işler - ayrıntılar için [İçe aktarma ve dışa aktarma] sayfasına bakın).

# satır listesini içe aktar
linelist <- import("linelist_cleaned.rds")

Çizgi listesinin ilk 50 satırı aşağıda görüntülenmektedir:

Tabloyu hazırlama

flextable kullanmaya başlamadan önce tablonuzu veri çerçevesine dönüştürmeniz gerekecektir. janitor ve dplyr gibi paketleri kullanarak bir veri çerçevesinin nasıl oluşturulacağını öğrenmek için Tanımlayıcı tablolar ve [Veri pivotlama] sayfalarına bakabilirsiniz. İçeriği, görüntülenmesini istediğiniz gibi satırlar ve sütunlar halinde düzenlemelisiniz. Ardından, veri çerçevesinin rengi, başlığı, yazı tipleri vb. ile görüntülemek için flextable’e geçirilecektir.

Aşağıda, Tanımlayıcı tablolar sayfasından, vaka satır listesi örnek olarak kullanılmıştır. Hazırlanan tabloda toplamlar satırı ile hastaneye göre hasta sonuçları ve CT değerlerini özetlenmiştir.

table <- linelist %>% 
  
  # Hastane sonuç grubu başına özet değerleri al
  ###############################################
  group_by(hospital, outcome) %>%                      # Grup verisi
  summarise(                                           # İlgilenilen göstergelerin yeni özet sütunları oluştur
    N = n(),                                            # Hastane-sonuç grubu başına satır sayısı   
    ct_value = median(ct_blood, na.rm=T)) %>%           # Grup başına medyan CT değeri
  
  # Toplamları ekle
  ############
  bind_rows(                                           # Önceki tabloyu mini toplamlar tablosuyla birleştir
    linelist %>% 
      filter(!is.na(outcome) & hospital != "Missing") %>%
      group_by(outcome) %>%                            # Hastaneye göre değil, yalnızca sonuca göre gruplandır  
      summarise(
        N = n(),                                       # Tüm veri kümesi için satır sayısı    
        ct_value = median(ct_blood, na.rm=T))) %>%     # Tüm veri seti için medyan CT değeri
  
  # Geniş pivotlama ve format
  ########################
  mutate(hospital = replace_na(hospital, "Total")) %>% 
  pivot_wider(                                         # uzundan genişe pivotla
    values_from = c(ct_value, N),                       # yeni değerler ct ve count sütunlarından alınır
    names_from = outcome) %>%                           # yeni sütun adları sonuçlardan alınır
  mutate(                                              # yeni sütun ekle
    N_Known = N_Death + N_Recover,                               # sonucu bilinen sayı
    Pct_Death = scales::percent(N_Death / N_Known, 0.1),         # ölen vakaların yüzdesi (1 ondalık basamağa kadar)
    Pct_Recover = scales::percent(N_Recover / N_Known, 0.1)) %>% # iyileşen vakaların yüzdesi (1 ondalık basamağa kadar)
  select(                                              # Sütunları yeniden sırala
    hospital, N_Known,                                   # Giriş sütunları
    N_Recover, Pct_Recover, ct_value_Recover,            # İyileşen vaka sütunları
    N_Death, Pct_Death, ct_value_Death)  %>%             # Ölen vaka sütunları
  arrange(N_Known)                                     # Satırları en düşükten en yükseğe doğru düzenle (Toplam satırı en altta)

table  # yazdır
## # A tibble: 7 × 8
## # Groups:   hospital [7]
##   hospital                     N_Known N_Rec…¹ Pct_R…² ct_va…³ N_Death Pct_D…⁴ ct_va…⁵
##   <chr>                          <int>   <int> <chr>     <dbl>   <int> <chr>     <dbl>
## 1 St. Mark's Maternity Hospit…     325     126 38.8%        22     199 61.2%        22
## 2 Central Hospital                 358     165 46.1%        22     193 53.9%        22
## 3 Other                            685     290 42.3%        21     395 57.7%        22
## 4 Military Hospital                708     309 43.6%        22     399 56.4%        21
## 5 Missing                         1125     514 45.7%        21     611 54.3%        21
## 6 Port Hospital                   1364     579 42.4%        21     785 57.6%        22
## 7 Total                           3440    1469 42.7%        22    1971 57.3%        22
## # … with abbreviated variable names ¹​N_Recover, ²​Pct_Recover, ³​ct_value_Recover,
## #   ⁴​Pct_Death, ⁵​ct_value_Death

29.2 Temel flextable

Flextable oluşturma

flextable nesnelerini oluşturmak ve yönetmek için, önce veri çerçevesini flextable() fonksiyonundan geçirilir. Sonuç my_table olarak kaydedilir.

my_table <- flextable(table) 
my_table

Bu yapıldıktan sonra, daha fazla flextable biçimlendirme fonksiyonları aracılığıyla my_table nesnesi aşamalı olarak yönlendirilebilir.

Bu sayfada, anlaşılır olması için ara adımlarda tablo my_table olarak kaydedilecek ve flextable fonksiyonları bit-bit eklenecektir. Kodun başından sonuna kadar tümünü tek bir yığın halinde yazılmış olarak görmek isterseniz, aşağıdaki Bütün kodlar bölümünü ziyaret edebilirsiniz.

flextable koduna ait her bir satırının genel sözdizimi aşağıdaki gibidir:

  • function(table, i = X, j = X, part = "X"), burada:
    • function, sütun genişliklerini belirlemek için width(), arka plan renklerini ayarlamak için bg(), metnin merkeze/sağa/sola hizalı olup olmadığını ayarlamak için align() gibi birçok farklı fonksiyondan biri olabilir.
    • table = veri çerçevesinin adıdır, ancak veri çerçevesi fonksiyona aktarılıyorsa belirtilmesine gerek yoktur.
    • part = fonksiyonun tablonun hangi bölümüne uygulandığını belirtir. Örneğin. “başlık”, “gövde” veya “tümü”.
    • i = fonksiyonun uygulanacağı satırı belirtir, burada X satır numarasıdır. Birden fazla satır varsa, ör. birinci ila üçüncü satırlar arasında şu şekilde yazılabilir: i = c(1:3). ‘Gövde’ seçiliyse, ilk satırın başlık bölümünün altından başladığını unutmayın.
    • j = fonksiyonun uygulanacağı sütununu belirtir, burada X sütun numarası veya adıdır. Birden çok sütun varsa, ör. beşinci ve altıncı, şu şekilde yazılabilir: j = c(5,6).

flextable biçimlendirme fonksiyonlarına ait tam listeyi burada bulabilir veya ?flextable komutunu girerek belgeleri inceleyebilirsiniz.

Sütun genişliği

Her hücrede yalnızca bir metin satırı olacak şekilde tabloyu güzelce genişleten autofit() fonksiyonunu kullanabiliriz. qflextable() fonksiyonu, flextable() ve autofit() için uygun bir kısayoldur.

my_table %>% autofit()

Ancak, özellikle hücreler içinde çok uzun değerler varsa, bu fonksiyon her zaman uygun olmayabilir, tablo sayfaya sığmayabilir.

Bunun yerine genişlikleri width() fonksiyonu ile belirtebilir. Hangi genişlik değerini koyacağınızı bilmek biraz zaman alabilir. Aşağıdaki örnekte, sütun 1, 2, 4 ve 8 için farklı genişlikler belirlenmiştir.

my_table <- my_table %>% 
  width(j=1, width = 2.7) %>% 
  width(j=2, width = 1.5) %>% 
  width(j=c(4,5,7,8), width = 1)

my_table

Sütun başlıkları

Tablo içeriklerinin daha kolay yorumlanması için daha net başlıklar istenir.

Bu tablo için, aynı alt grupları kapsayan sütunların birlikte gruplanabilmesi için ikinci bir başlık katmanı eklemek istiyoruz. Bu top = TRUE argümanı ve add_header_row() fonksiyonu ile yapılmaktadır. Daha sonra birleştirilecek sütunlar için "" boş değer bırakılarak, her sütunun yeni adı values = argümanıyla verilmektedir.

İkinci başlıktaki başlık adları ayrı bir set_header_labels() komutuyla yeniden adlandırılır.

Son olarak, üst başlıktaki belirli sütun başlıklarını “birleştirmek” için, merge_at() fonksiyonu kullanılır.

my_table <- my_table %>% 
  
  add_header_row(
    top = TRUE,                # Yeni başlık, mevcut başlık satırının üstüne eklenir
    values = c("Hospital",     # Aşağıdaki her sütun için başlık değerleri
               "Total cases with known outcome", 
               "Recovered",    # Bu, bunun ve sonraki iki sütunun en üst düzey başlığı olacak
               "",
               "",
               "Died",         # Bu, bunun ve sonraki iki sütunun en üst düzey başlığı olacak
               "",             # "Öldü" ile birleştirileceği için boş bırak
               "")) %>% 
    
  set_header_labels(         # Orijinal başlık satırındaki sütunları yeniden adlandır
      hospital = "", 
      N_Known = "",                  
      N_Recover = "Total",
      Pct_Recover = "% of cases",
      ct_value_Recover = "Median CT values",
      N_Death = "Total",
      Pct_Death = "% of cases",
      ct_value_Death = "Median CT values")  %>% 
  
  merge_at(i = 1, j = 3:5, part = "header") %>% # Yeni başlık satırında 3 ile 5 arasındaki sütunları yatay olarak birleştir
  merge_at(i = 1, j = 6:8, part = "header")     # HYeni başlık satırında 6 ile 8 arasındaki sütunları yatay olarak birleştir

my_table  # print

Kenarlıklar ve arka plan

Çeşitli flextable fonksiyonlarıyla kenarlıkları, iç çizgileri vb. ayarlayabilirsiniz. border_remove() ile mevcut tüm sınırları kaldırarak başlamak genellikle daha kolaydır.

Ardından, tabloyu theme_box(), theme_booktabs() veya theme_alafoli() öğelerine geçirerek varsayılan kenarlık temalarını uygulayabilirsiniz.

Çeşitli fonksiyonlara dikey ve yatay çizgiler ekleyebilirsiniz. hline() ve vline() sırasıyla belirli bir satıra veya sütuna satır ekler. Her birinin içinde “part =” öğesini “tümü”, “gövde” veya “başlık” olarak belirtmelisiniz. Dikey çizgiler için sütunu j = ve yatay çizgiler için satırı i = olarak belirtmelisiniz. vline_right(), vline_left(), hline_top() ve hline_bottom() gibi diğer işlevler yalnızca dış taraflara satır ekler.

Tüm bu fonksiyonlarda, çizgi stili border = olarak belirtilmelidir ayrıca officer paketinden fp_border() fonksiyonunu kullanan ayrı bir komutun çıktısı şeklinde olmalıdır. Bu fonksiyon, çizginin genişliğini ve rengini tanımlamanıza yardımcı olur. Bunu aşağıda gösterildiği gibi tablo komutlarının üzerinde tanımlayabilirsiniz.

# sınır çizgisi için stil tanımla
border_style = officer::fp_border(color="black", width=1)

# tabloya sınır çizgileri ekle
my_table <- my_table %>% 

  # Mevcut tüm sınırları kaldır
  border_remove() %>%  
  
  # önceden belirlenmiş bir tema ayarıyla yatay çizgiler ekle
  theme_booktabs() %>% 
  
  # İyileşen ve Ölen bölümleri ayırmak için dikey çizgiler ekleyin
  vline(part = "all", j = 2, border = border_style) %>%   # sütun 2'de 
  vline(part = "all", j = 5, border = border_style)       # sütun 5'de

my_table

Yazı tipi ve hizalama

flextable’daki align() fonksiyonunu kullanarak en soldaki sütun dışındaki tüm sütunlar hastane adlarıyla ortalayarak hizalanabilir.

my_table <- my_table %>% 
   flextable::align(align = "center", j = c(2:8), part = "all") 
my_table

Ek olarak, başlık yazı tipi boyutunu artırabilir ve ardından kalın olarak değiştirebilir. Toplam satırı da kalın olarak değiştirebilir.

my_table <-  my_table %>%  
  fontsize(i = 1, size = 12, part = "header") %>%   # başlığın font büyüklüğünü değiştir
  bold(i = 1, bold = TRUE, part = "header") %>%     # başlığın kalınlığını ayarla
  bold(i = 7, bold = TRUE, part = "body")           # toplam satırın kalınlığını ayarla (gövdenin 7. satırı)

my_table

colformat_num() fonksiyonunu kullanarak orantı sütunlarının yalnızca bir ondalık basamak göstermesi sağlanabilir. Bunun, round() fonksiyonuyla veri yönetimi aşamasında da yapılabileceğini unutmayın.

my_table <- colformat_num(my_table, j = c(4,7), digits = 1)
my_table

Hücreleri birleştirme

Başlık satırındaki hücreler yatay olarak birleştirilebileciği gibi, merge_at() kullanılarak ve satırları (i) ve sütunu (j) belirtilerek hücreler dikey olarak da birleştirebilir. Burada daha fazla yer açmak için “Hastane” ve “Sonucu bilinen toplam vaka” değerleri dikey olarak birleştirilmektedir.

my_table <- my_table %>% 
  merge_at(i = 1:2, j = 1, part = "header") %>% 
  merge_at(i = 1:2, j = 2, part = "header")

my_table

Arka plan rengi

Tablonun içeriğini başlıklardan ayırt etmek için ek biçimlendirme eklemek istenebilir. Örneğin, arka plan rengini değiştirme. Bu örnekte tablo gövdesini gri olarak değiştirmekteyiz.

my_table <- my_table %>% 
    bg(part = "body", bg = "gray95")  

my_table 

29.3 Koşullu biçimlendirme

Belirli bir kuralı karşılayan bir sütundaki tüm değerler vurgulanabilir. Örneğin, vakaların %55’inden fazlasının öldüğü yer. Ölçütleri i = veya j = argümanına, önünde bir tilde ~ gelecek şekilde koyulması yeterlidir. Değerler görüntülenen başlığa değil, veri çerçevesindeki sütununa refere edilmelidir.

my_table %>% 
  bg(j = 7, i = ~ Pct_Death >= 55, part = "body", bg = "red") 

Veya, ilgilenilen bir hastane gibi belirli bir kriteri karşılayan tüm satır vurgulanabilir. Ölçütlerin tüm sütunlara uygulanabilmesi için sütun (j) argümanının kaldırılması yeterlidir.

my_table %>% 
  bg(., i= ~ hospital == "Military Hospital", part = "body", bg = "#91c293") 

29.4 Bütün kodlar

Aşağıda, yukarıdaki bölümlerdeki bahsi geçen bütün kodlar paylaşılmaktadır.

border_style = officer::fp_border(color="black", width=1)

pacman::p_load(
  rio,            # içe/dışa aktar
  here,           # dosya yolağı
  flextable,      # HTML tablosu oluştur 
  officer,        # tablolar için yardımcı fonksiyonlar
  tidyverse)      # veri yönetimi, özetlemesi ve görselleştirilmesi

table <- linelist %>% 

  # Hastane sonuç grubu başına özet değerleri al
  ###############################################
  group_by(hospital, outcome) %>%                      # Grup verisi
  summarise(                                           # İlgilenilen göstergelerin yeni özet sütunları oluştur
    N = n(),                                            # Hastane-sonuç grubu başına satır sayısı   
    ct_value = median(ct_blood, na.rm=T)) %>%           # Grup başına medyan CT değeri
  
  # Toplamları ekle
  ############
  bind_rows(                                           # Önceki tabloyu mini toplamlar tablosuyla birleştir
    linelist %>% 
      filter(!is.na(outcome) & hospital != "Missing") %>%
      group_by(outcome) %>%                            # Hastaneye göre değil, yalnızca sonuca göre gruplandır  
      summarise(
        N = n(),                                       # Tüm veri kümesi için satır sayısı    
        ct_value = median(ct_blood, na.rm=T))) %>%     # Tüm veri seti için medyan CT değeri
  
  # Geniş pivotlama ve format
  ########################
  mutate(hospital = replace_na(hospital, "Total")) %>% 
  pivot_wider(                                         # uzundan genişe pivotla
    values_from = c(ct_value, N),                       # yeni değerler ct ve count sütunlarından alınır
    names_from = outcome) %>%                           # yeni sütun adları sonuçlardan alınır
  mutate(                                              # yeni sütun ekle
    N_Known = N_Death + N_Recover,                               # sonucu bilinen satırların sayısı
    Pct_Death = scales::percent(N_Death / N_Known, 0.1),         # ölen vakaların yüzdesi (1 ondalık basamağa kadar)
    Pct_Recover = scales::percent(N_Recover / N_Known, 0.1)) %>% # iyileşen vakaların yüzdesi (1 ondalık basamağa kadar)
  select(                                              # Sütunları yeniden sırala
    hospital, N_Known,                                   # Giriş sütunları
    N_Recover, Pct_Recover, ct_value_Recover,            # İyileşen vaka sütunları
    N_Death, Pct_Death, ct_value_Death)  %>%             # Ölen vaka sütunları
  arrange(N_Known) %>%                                 # Satırları en düşükten en yükseğe doğru düzenle (Toplam satırı en altta)

  # formatlama
  ############
  flextable() %>%              # tablo yukarıdan aktarılır
  add_header_row(
    top = TRUE,                # Yeni başlık, mevcut başlık satırının üstüne eklenir
    values = c("Hospital",     # Aşağıdaki her sütun için başlık değerleri
               "Total cases with known outcome", 
               "Recovered",    # Bu, bunun ve sonraki iki sütunun en üst düzey başlığı olacak
               "",
               "",
               "Died",         # Bu, bunun ve sonraki iki sütunun en üst düzey başlığı olacak
               "",             # "Öldü" ile birleştirileceği için boş bırak
               "")) %>% 
    set_header_labels(         # Orijinal başlık satırındaki sütunları yeniden adlandır
      hospital = "", 
      N_Known = "",                  
      N_Recover = "Total",
      Pct_Recover = "% of cases",
      ct_value_Recover = "Median CT values",
      N_Death = "Total",
      Pct_Death = "% of cases",
      ct_value_Death = "Median CT values")  %>% 
  merge_at(i = 1, j = 3:5, part = "header") %>% # Yeni başlık satırında 3 ile 5 arasındaki sütunları yatay olarak birleştir
  merge_at(i = 1, j = 6:8, part = "header") %>%  
  border_remove() %>%  
  theme_booktabs() %>% 
  vline(part = "all", j = 2, border = border_style) %>%   # at column 2 
  vline(part = "all", j = 5, border = border_style) %>%   # at column 5
  merge_at(i = 1:2, j = 1, part = "header") %>% 
  merge_at(i = 1:2, j = 2, part = "header") %>% 
  width(j=1, width = 2.7) %>% 
  width(j=2, width = 1.5) %>% 
  width(j=c(4,5,7,8), width = 1) %>% 
  flextable::align(., align = "center", j = c(2:8), part = "all") %>% 
  bg(., part = "body", bg = "gray95")  %>% 
  bg(., j=c(1:8), i= ~ hospital == "Military Hospital", part = "body", bg = "#91c293") %>% 
  colformat_num(., j = c(4,7), digits = 1) %>%
  bold(i = 1, bold = TRUE, part = "header") %>% 
  bold(i = 7, bold = TRUE, part = "body")
## `summarise()` has grouped output by 'hospital'. You can override using the `.groups`
## argument.
table

29.5 Tablonun kaydedilmesi

Tablonun nihai çıktınıza entegre edilmesinin farklı yolları vardır.

Tek bir tablonun kaydedilmesi

Tabloları Word, PowerPoint, HTML veya görüntü (PNG) dosyaları olarak dışa aktarabilirsiniz. Bunu yapmak için aşağıdaki fonksiyonlardan uygun olanı kullanın:

  • save_as_docx()
  • save_as_pptx()
  • save_as_image()
  • save_as_html()

Örnek olarak aşağıda tablo word belgesi olarak kaydedilmektedir. İlk argümanın sözdizimine dikkat edilirse - sadece **flextable* nesnesinin adı verilebilir, ör. my_table veya aşağıda gösterildiği gibi bir “ad” da verilebilir (“my table”). Ad, Word’deki tablonun başlığı olarak görünecektir. Aşağıda ayrıca PNG olarak kaydetme kodu da paylaşılmıştır.

# Tablo başlığını 'my table' olarak düzenle  
save_as_docx("my table" = my_table, path = "file.docx")

save_as_image(my_table, path = "file.png")

Bir flextable tablosunu resim olarak kaydetmek için webshot veya webshot2 paketlerinin gerekli olduğunu unutmayın. Görüntüler şeffaf arka planla çıkartılabilir.

flextable çıktının ‘canlı’ bir sürümü belge biçiminde görüntülemek istenirse, print() fonksiyonu kullanılabilir. preview = argümanı için aşağıdakilerden birini belirtmek gerekmektedir. Belge, bilgisayarınızda tanımlanan yazılım programında “açılır” ancak kaydedilmez. Bu durum, tablonun bir sayfaya / slayda sığıp sığmadığını kontrol etmek için yararlı olabilir böylece onu başka bir belgeye hızlı bir şekilde kopyalayabilirsiniz. Bağımsız değişken önizlemesini “pptx” veya “docx” olarak ayarlayabilirsiniz.

print(my_table, preview = "docx") # Word örneği
print(my_table, preview = "pptx") # Powerpoint örneği 

Tabloyu R markdown’da yazdırma

Tablo nesnesi otomatik olarak bir belgenize veya R markdown çıktısına entegre edilebilir. Bu, değişen verilerle tablonun güncellenebileceği ve böylece sayıların yenilenebileceği anlamına gelmektedir.

Bu el kitabının R Markdown ile Raporlar sayfasındaki ayrıntılara bakın.