【问题标题】:KableExtra conditionally formatting specific rows on a columnKableExtra 有条件地格式化列上的特定行
【发布时间】:2018-11-12 21:53:05
【问题描述】:

我刚刚学习了 KableExtra,并且知道如何使用 mutate() 有条件地格式化整个列,如使用 mutate 的文档中所述:

mutate(
   mpg = cell_spec(mpg, background = ifelse(mpg > 20, "red", "blue"))
)

但我不知道的是,如何在显示所有行的同时更改每列中某些行的背景颜色。

比如我的数据:

df <- data.frame( region1 = c("A", sample(1:5,3)),
                  region2 = c("B", sample(1:5,3)),
                  region3 = c("C", sample(1:5,3)),
                  region4 = c("A", sample(1:5,3)) )

现在我只想格式化第二行和第三行。我不想更改第一行和最后一行的颜色背景。这些第二和第三行在大于 1 时应为“红色”,或等于 1 时为黄色,小于 1 时为绿色。

有人可以帮我吗?

【问题讨论】:

  • 只有第一行是字母,其他行都是数字吗?
  • 我需要显示一个表格,其中几行是字符串,其余的是数字。我必须在不同的列中格式化数字。我不知道如何处理混合类型的数据框。我应该单独保留它们吗?如果是这样,我将如何将它们显示为单个表格..:-(
  • 我尽量坚持整洁的数据格式(请参阅 PDF 了解 Hadley Wickham 关于该主题的论文)——简而言之,行是观察,而列是变量——所以我会保留字母和如果它们引用相同的变量,则将数字放在一起。

标签: r kable kableextra


【解决方案1】:

这是一个例子,它根据值忽略第一行和最后一行以及颜色,就像你说的那样,但忽略字母。

首先,我加载库。

# Load libraries
library(knitr)
library(kableExtra)

接下来,我创建一个虚拟数据框。

# Create data frame   
df <- data.frame( region1 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
                  region2 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
                  region3 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)),
                  region4 = c(sample(c(-5:5, letters[1:5]), 10, replace = TRUE)), stringsAsFactors = FALSE )

在这里,我定义了格式化单元格的函数。我忽略第一行和最后一行并检查字符是字母还是数字,然后相应地着色。

foo <- function(x, n, nmax){
  cell_spec(x, background = ifelse(is.na(as.numeric(x)), "white",
                                   ifelse(n == nmax | n == 1, "white",
                                          ifelse(x > 1, "red",
                                                 ifelse(x < 1, "green", "yellow")))))
}

最后,我应用了这个函数。

df %>% 
  mutate_all(funs(foo(., n = row_number(), nmax = n()))) %>% 
  kable(escape = FALSE) %>% 
  kable_styling()

【讨论】:

  • 太棒了。根据您的帮助,我已经学习并扩展了。非常感谢您节省了我的时间。我正要放弃。有人告诉编码是诗歌。但我在您的函数用法中看到了这一点!再次感谢!
【解决方案2】:

对于数据框来说,这不是一个好的设计:列需要全部为一种类型,因此您的数字将被强制转换为字符。

不过,您可以按照以下要求进行操作。

fixcol <- function(col) {
  x <- as.numeric(col[2:3])
  x <- cell_spec(x, background = ifelse(x > 1, "red", ifelse(x == 1, "yellow", "green")))
  col[2:3] <- x
  col
}

df <- as.data.frame(lapply(df, fixcol))
kable(df, escape = FALSE)

【讨论】:

  • 非常感谢。我收到一个错误:[&lt;-.factor(*tmp*, 2:3, value = NULL) 中的错误:替换的长度为零。我做错什么了吗?
  • 您可以在fixcol 函数中打印col。如果它的条目少于 3 个,您会收到这样的消息,因为 x 最终会太短。
  • 我增加了行数……现在它变成了……NA
猜你喜欢
  • 2015-12-26
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多