考虑示例 data.frame
df <- data.frame(
id = 1:4,
name = c("Bob", "Ashley", "James", "David"),
age = c(48, NA, 40, 28),
test1_score = c(18.9, 19.5, NA, 12.9),
stringsAsFactors = FALSE)
我正在使用 R 包 formattable 来制作一个漂亮的表格。
library(formattable)
formattable(df, list(
age = color_tile("white", "orange"),
test1_score = color_bar("pink", 'proportion', 0.2)
))
过去是自动不打印 NA,而是打印空白。似乎这不再是默认设置,但我仍然想为 NA 打印一个空白。像这样替换 NA 有效:
df[is.na(df)]=''
formattable(df, list(
age = color_tile("white", "orange"),
test1_score = color_bar("pink", 'proportion', 0.2)
))
但是,如果我尝试格式化其中一列以强制它具有 2 个小数位,那么讨厌的 NA 会返回:
df$age = digits(df$age, digits=2)
formattable(df, list(
age = color_tile("white", "orange"),
test1_score = color_bar("pink", 'proportion', 0.2)
))
如果我再次删除 NA,NA 会消失,但小数位也会消失
df[is.na(df)] = ''
formattable(df, list(
age = color_tile("white", "orange"),
test1_score = color_bar("pink", 'proportion', 0.2)
))
我相信原因是数字转换df$age
为formattable numeric
对象并创建NA
, 并df[is.na(df)] = ''
转换df$age
为formattable character
对象:
> df$age = digits(df$age, digits=2)
> df$age
[1] 48.00 NA 40.00 28.00
> class(df$age)
[1] "formattable" "numeric"
> df[is.na(df)] = ''
> df$age
[1] "48" " " "40" "28"
> class(df$age)
[1] "formattable" "character"
关于解决方案的任何想法?
最终,我还想将它与过滤后的 data.frame 一起使用,在这里我使用Filtering dataframes with formattable 中的代码来确保在过滤 data.frame 时色标保持不变:
df$age = digits(df$age, digits=2)
subset_df <- function(m) {
formattable(df[m, ], list(
age = x ~ color_tile("white", "orange")(df$age)[m],
test1_score = x ~ color_bar("pink", 'proportion', 0.2)(df$test1_score)[m],
test2_score = x ~ color_bar("pink", 'proportion', 0.2)(df$test2_score)[m]
))
}
subset_df(1:3)
不过,问题似乎与此代码无关。