R -打印表格,列和如下

lo8azlld  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(125)

示例:我有一个简单的数据框

df <- data.frame(date=c("2016-01-01", "2016-01-02")
                 , sales_a = c(2,3)
                 , sales_b = c(1,1)
                 , diff=c(1,2))

我目前正在一个RMarkDown文档中使用kable打印这个df。我想在下面生成一行,列的总和(不是日期),用一条线将df与总和分开。这在任何R包中都可能实现吗?
谢谢

ecfdbz9o

ecfdbz9o1#

我不认为你可以在markdown中的最后一行和倒数第二行之间画一条线,但是计算和包括一个摘要行是相对直接的。
(BTW:我在data.frame中包含了stringsAsFactors,这是为了方便处理新字符串。)

df <- data.frame(date=c("2016-01-01", "2016-01-02")
               , sales_a = c(2,3)
               , sales_b = c(1,1)
               , diff=c(1,2)
               , stringsAsFactors = FALSE)
func <- function(z) if (is.numeric(z)) sum(z) else ''
sumrow <- as.data.frame(lapply(df, func))
sumrow
#   date sales_a sales_b diff
# 1            5       2    3

与整个数据相合并相对简单。frame:

library(knitr)
kable(rbind(df, sumrow))
# |date       | sales_a| sales_b| diff|
# |:----------|-------:|-------:|----:|
# |2016-01-01 |       2|       1|    1|
# |2016-01-02 |       3|       1|    2|
# |           |       5|       2|    3|

如果希望能够突出显示/标记特定汇总行:

kable(rbind(cbind(' '=' ', df),
            cbind(' '='Total', sumrow)))
# |      |date       | sales_a| sales_b| diff|
# |:-----|:----------|-------:|-------:|----:|
# |      |2016-01-01 |       2|       1|    1|
# |      |2016-01-02 |       3|       1|    2|
# |Total |           |       5|       2|    3|

“总计”标签当然可以放在任何地方。你可以尝试手动添加一行(字符),但我不确定它看起来是否正确。

63lcw9qa

63lcw9qa2#

我以https://stackoverflow.com/a/36069586/8076560的答案为灵感,用RStudio在R中创建了以下内容,然后可以根据需要将表格导出(编织)为pdf/html。

现在是代码...

```{r name-of-chunk, echo=FALSE}    

# Load packages
library(dplyr)
library(kableExtra)

# Make lists
types <- c("Heating", "Water Heating", "Electricity")
heat_per_person <- c (9.59, 1.32, 1.95)
heat_per_area <- c(95.26, 13.55, 20.03)

# Make dataframe
results_df <- data.frame(types , heat_per_person, heat_per_area, stringsAsFactors = FALSE)

# Sum the last row of each column if numeric 
func <- function(z) if (is.numeric(z)) sum(z) else '' 
sumrow <- as.data.frame(lapply(results_df, func))

# Give name to the first element of the new data frame created above
sumrow[1] <- "Total"

# Add the original and new data frames together
summed_results_df <- rbind(results_df, sumrow)

# Name the columns
colnames <- data.frame("Service", "Amount per Person","Amount per Area", stringsAsFactors = FALSE)
colnames(summed_results_df) <- colnames

# Make Table
kable(summed_results_df, caption = "Normalized Annual Energy Demand", booktabs = TRUE) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed")) %>%
  row_spec(dim(summed_results_df)[1], bold = T) %>% # format last row
  column_spec(1, italic = T) # format first column

您可以使用代码块的名称引用Rmarkdown/ Rmd文本中的表,如下所示:`\@ref(tab:name-of-chunk)`
ttygqcqt

ttygqcqt3#

这是一个tidyverse解决方案,使用了booktabs kable选项。
add_totals函数保持简单,它在任何非数字列中显示“Total”。
总计上方的水平线是使用linesep kable选项添加的,该选项默认为c("", "", "", "", "\\addlinespace"),这意味着每隔5行添加一个额外的空格,而每隔1到4行则不添加任何空格(""),我在倒数第二行后添加了一个\midrule,而不是这个默认值:这意味着在行数减2(nrow(df) - 2)的行数之后不添加任何内容(""),并且在下一行(倒数第二行)之后添加水平行(\midrule)。

---
output: pdf_document
---

```{r showcase, echo = FALSE, message=FALSE}
library(dplyr)
library(kableExtra)

df <- data.frame(date=c("2016-01-01", "2016-01-02")
                 , sales_a = c(2,3)
                 , sales_b = c(1,1)
                 , diff=c(1,2))

add_totals <- function(x) x %>%
    ungroup %>% # you never know ...
    bind_rows(summarise(., across(where(is.numeric), sum),
                        across(where(is.character), ~ "Total")))

df %>%
    add_totals %>%
    kable(booktabs = TRUE,
          linesep = c(rep("", nrow(.) - 2), "\\midrule"))

这将生成以下输出:

![](https://i.stack.imgur.com/NN4le.png)

相关问题