R 数据框单元格包含 dataframe/tibble - 如何访问或可视化?

R dataframe cell contains dataframe/tibble - how to access or visualize?

出色的包 inspectdf 生成小标题输出,其中一列包含另一个小标题(或列表)。此问题底部 dput 中的示例数据如下所示:

> test
# A tibble: 4 x 10
  col_name     min    q1 median    mean    q3     max       sd pcnt_na hist             
  <chr>      <dbl> <dbl>  <dbl>   <dbl> <dbl>   <dbl>    <dbl>   <dbl> <list>           
1 contacts    0       1      1     4.14    2     480     14.9    1.10  <tibble [26 x 2]>
2 pop         0.02  735.  2225. 4651.   4722. 289825. 10590.     0.082 <tibble [17 x 2]>
3 limit       0     750   1000  5994.   3500  500000  33355.     0.055 <tibble [27 x 2]>
4 code_count  1       1      1     1.72    2      43      1.50   0     <tibble [24 x 2]>

其中相关列的内容包含:

> test$hist[1]
[[1]]
# A tibble: 26 x 2
   value          prop
   <chr>         <dbl>
 1 [-Inf, 0)  0       
 2 [0, 20)    0.961   
 3 [20, 40)   0.0200  
 4 [40, 60)   0.00696 
 5 [60, 80)   0.00352 
 6 [80, 100)  0.00200 
 7 [100, 120) 0.00144 
 8 [120, 140) 0.000837
 9 [140, 160) 0.000696
10 [160, 180) 0.000459
# ... with 16 more rows

问题是,如何使最后一列可访问或能够从显示机制中可视化?例如,当我使用 DT 时,它会将 [object: Object] 放在最右边的列中,而我想要一些有用的东西,比如 link 来查看或弹出嵌入的数据:

library(DT)
test %>% DT::datatable()

有没有办法使用迷你图,或制作 link,或任何其他方式来显示最后一列的内容?欢迎所有方法(如果有一种方法可以在 DT 内执行此操作,那将是理想的选择)。感谢您的帮助。

test <- structure(list(col_name = c("contacts", "pop", "limit", "code_count"
), min = c(0, 0.02, 0, 1), q1 = c(1, 735.1, 750, 1), median = c(1, 
2224.73, 1000, 1), mean = c(4.142, 4651.211, 5994.002, 1.717), 
q3 = c(2, 4721.56, 3500, 2), max = c(480, 289825.16, 5e+05, 
43), sd = c(14.926, 10590.427, 33354.671, 1.501), pcnt_na = c(1.103, 
0.082, 0.055, 0), hist = list(structure(list(value = c("[-Inf, 0)", 
"[0, 20)", "[20, 40)", "[40, 60)", "[60, 80)", "[80, 100)", 
"[100, 120)", "[120, 140)", "[140, 160)", "[160, 180)", "[180, 200)", 
"[200, 220)", "[220, 240)", "[240, 260)", "[260, 280)", "[280, 300)", 
"[300, 320)", "[320, 340)", "[340, 360)", "[360, 380)", "[380, 400)", 
"[400, 420)", "[420, 440)", "[440, 460)", "[460, 480)", "[480, Inf)"
), prop = c(0, 0.961394177780924, 0.0200167851400953, 0.00696279968047565, 
0.00352285711396706, 0.00199601605710992, 0.00143785959129195, 
0.000837234698726958, 0.000695673276236893, 0.000459063470074926, 
0.00138527963436707, 0.00129023125069517, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 2.02230603557236e-06, 0)), row.names = c(NA, 
-26L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    value = c("[-Inf, 0)", "[0, 20000)", "[20000, 40000)", 
    "[40000, 60000)", "[60000, 80000)", "[80000, 1e+05)", 
    "[1e+05, 120000)", "[120000, 140000)", "[140000, 160000)", 
    "[160000, 180000)", "[180000, 2e+05)", "[2e+05, 220000)", 
    "[220000, 240000)", "[240000, 260000)", "[260000, 280000)", 
    "[280000, 3e+05)", "[3e+05, Inf)"), prop = c(0, 0.965121399547629, 
    0.0219419924337957, 0.00583678616465502, 0.00279829460157329, 
    0.00160731800076062, 0.00102283872775676, 0.000630517023959647, 
    0.000388318421105306, 0.000296242919193739, 0.000178146079785424, 
    6.40525230689165e-05, 6.20508817230129e-05, 4.60377509557837e-05, 
    4.00328269180728e-06, 2.00164134590364e-06, 0)), row.names = c(NA, 
-17L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    value = c("[-Inf, 0)", "[0, 20000)", "[20000, 40000)", 
    "[40000, 60000)", "[60000, 80000)", "[80000, 1e+05)", 
    "[1e+05, 120000)", "[120000, 140000)", "[140000, 160000)", 
    "[160000, 180000)", "[180000, 2e+05)", "[2e+05, 220000)", 
    "[220000, 240000)", "[240000, 260000)", "[260000, 280000)", 
    "[280000, 3e+05)", "[3e+05, 320000)", "[320000, 340000)", 
    "[340000, 360000)", "[360000, 380000)", "[380000, 4e+05)", 
    "[4e+05, 420000)", "[420000, 440000)", "[440000, 460000)", 
    "[460000, 480000)", "[480000, 5e+05)", "[5e+05, Inf)"
    ), prop = c(0, 0.962615288870034, 0.00958330915327091, 
    0.0104617958348925, 0.00314974495870712, 0, 0.00967936236675118, 
    0, 5.00277153543063e-05, 0, 0, 8.80487790235791e-05, 
    0, 0.000580321498109953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0.00379210082385642, 0)), row.names = c(NA, -27L), class = c("tbl_df", 
"tbl", "data.frame")), structure(list(value = c("[-Inf, 0)", 
"[0, 2)", "[2, 4)", "[4, 6)", "[6, 8)", "[8, 10)", "[10, 12)", 
"[12, 14)", "[14, 16)", "[16, 18)", "[18, 20)", "[20, 22)", 
"[22, 24)", "[24, 26)", "[26, 28)", "[28, 30)", "[30, 32)", 
"[32, 34)", "[34, 36)", "[36, 38)", "[38, 40)", "[40, 42)", 
"[42, 44)", "[44, Inf)"), prop = c(0, 0.663122, 0.251104, 
0.054242, 0.01933, 0.007962, 0.002444, 0.000946, 0.00032, 
0.00016, 8.4e-05, 4e-05, 1.4e-05, 1.2e-05, 8.4e-05, 0.000102, 
1.6e-05, 0, 4e-06, 2e-06, 2e-06, 4e-06, 6e-06, 0)), row.names = c(NA, 
-24L), class = c("tbl_df", "tbl", "data.frame")))), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))

您可能希望 unnestunnest_wider 保留在同一个数据帧中。

您可以使用 sparkline 包可视化嵌套的 tibble :

library(dplyr)
library(htmltools)
library(sparkline)
library(purrr)
library(DT)

# Create the HTML tag for each tibble
hist_spark <- test$hist %>% purrr::map( function(x) { 
  as.character(htmltools::as.tags(sparkline(x$prop)))
  })

test$hist_spark <- hist_spark

# Render the tags
datatable(test,
          options  = list(
                          columnDefs = list(list(visible=FALSE, targets=c(c(10)))),
                          fnDrawCallback = htmlwidgets::JS('function(){HTMLWidgets.staticRender();}')
                          )
          ) %>% sparkline::spk_add_deps()

fnDrawCallback 数据表选项和 spk_add_deps 是这个工作所必需的: