使用 formattable 过滤数据帧

Posted

技术标签:

【中文标题】使用 formattable 过滤数据帧【英文标题】:Filtering dataframes with formattable 【发布时间】:2015-10-31 23:55:59 【问题描述】:

示例数据(从formattablegithub docs 修改):

df <- data.frame(
  id = 1:10,
  name = c("Bob", "Ashley", "James", "David", "Jenny", 
           "Hans", "Leo", "John", "Emily", "Lee"), 
  age = c(48, 47, 40, 28, 29, 29, 27, 27, 31, 30),
  test1_score = c(18.9, 19.5, 19.6, 12.9, 11.1, 7.3, 4.3, 3.9, 2.5, 1.6),
  test2_score = c(9.1, 9.1, 9.2, 11.1, 13.9, 14.5, 19.2, 19.3, 19.1, 18.8),
  stringsAsFactors = FALSE)

你可以用这样的额外颜色格式制作一个漂亮的表格:

library(formattable)
formattable(df, list(
  age = color_tile("white", "orange"),
  test1_score = color_bar("pink", 0.2),
  test2_score = color_bar("pink", 0.2)
))

看起来像这样:

我现在要做的是过滤此表,以便我只保留前 n 行 - 这里 n=3。不这样做的方法是做典型的子集,因为色标现在只应用于数据子集的最小值/最大值,而不是原始数据。即

formattable(df[1:3,], list(
  age = color_tile("white", "orange"),
  test1_score = color_bar("pink", 0.2),
  test2_score = color_bar("pink", 0.2)
))

看起来像这样:

这显然重新调整了颜色。

查看对象的str

str(
formattable(df, list(
  age = color_tile("white", "orange"),
  test1_score = color_bar("pink", 0.2),
  test2_score = color_bar("pink", 0.2)
)) 
)

Classes ‘formattable’ and 'data.frame': 10 obs. of  5 variables:
 $ id         : int  1 2 3 4 5 6 7 8 9 10
 $ name       : chr  "Bob" "Ashley" "James" "David" ...
 $ age        : num  48 47 40 28 29 29 27 27 31 30
 $ test1_score: num  18.9 19.5 19.6 12.9 11.1 7.3 4.3 3.9 2.5 1.6
 $ test2_score: num  9.1 9.1 9.2 11.1 13.9 14.5 19.2 19.3 19.1 18.8
 - attr(*, "formattable")=List of 4
  ..$ formatter: chr "format_table"
  ..$ format   :List of 1
  .. ..$ :List of 3
  .. .. ..$ age        :function (x)  
  .. .. ..$ test1_score:function (x)  
  .. .. ..$ test2_score:function (x)  
  ..$ preproc  : NULL
  ..$ postproc : NULL

由于结构包含其他元素,因此无法仅过滤/子集生成的对象。

如果使用整个表/数据框,有没有办法只输出前 n 行完整的颜色比例?

【问题讨论】:

@Carl 由于与上述相同的原因,这不起作用 数字。觉得值得一试。似乎它必须是formattable 中的一个参数,因为当您输入formattable 时对数据进行子集化时,它显然无法知道其他行。 【参考方案1】:

从数据框的子集重新缩放是一项设计功能。如果您确实需要避免重新调整,您可以尝试当前可用的解决方法:

subset_df <- function(m) 
  formattable(df[m, ], list(
    age = x ~ color_tile("white", "orange")(df$age)[m],
    test1_score = x ~ color_bar("pink", 0.2)(df$test1_score)[m],
    test2_score = x ~ color_bar("pink", 0.2)(df$test2_score)[m]
  ))


subset_df(1:5)
subset_df(c(1,3,5,9))
subset_df(df$age <= mean(df$age))

它基本上强制每列的格式化函数应用于固定数据,并使用相同的子集过滤生成的格式化值。

【讨论】:

确实非常简洁 - 谢谢。我在闪亮的内部使用了一个可格式化的 obj - 原始有 >2000 行并且想要在每个变量上过滤前 10 个 - 这就是为什么保持原始缩放很好的原因

以上是关于使用 formattable 过滤数据帧的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个数据帧过滤 pyspark 数据帧

需要使用迭代多个列的过滤器值过滤 Spark 数据帧

使用 loc 删除索引过滤的数据帧

pandas:是不是可以使用任意长的布尔标准过滤数据帧?

使用 RDD 列表作为数据帧过滤操作的参数

使用Dask并行过滤数据帧的块