R语言 如何使用DT::datatables对具有科学编号的列进行排序

0yg35tkg  于 2023-09-27  发布在  其他
关注(0)|答案(3)|浏览(104)

下面的代码使用**RStudio DT**

library(shiny)
library(DT)
shinyApp(
  ui = fluidPage(
    DT::dataTableOutput('example')
  ),
  server = function(input, output) {
    output$example <- DT::renderDataTable({
      table = cbind(LETTERS[1:5],c("9.95e-04","9.93e-06","9.93e-02","9.49e-03","9.10e-02"))
      table
    },   options = list(
      columnDefs = list(list(type = "scientific", targets = 1))
    ))
  }
)

但它没有按我的意图对科学专栏进行排序。怎么做才是正确的呢?

正确的降序应该是:

V1         V2
 C     0.0993
 E      0.091
 D    0.00949
 A   0.000995
 B 0.00000993
yeotifhr

yeotifhr1#

这是我在评论部分提出的第一个解决方案的实现。

xy <- read.table(text = "V1         V2
 C     0.0993
 E      0.091
 D    0.00949
 A   0.000995
 B 0.00000993", header = TRUE, colClasses = c("character", "character"))
xy$V3 <- as.numeric(xy$V2)

xy[order(xy$V3, decreasing = TRUE), c("V1", "V2")]

  V1         V2
1  C     0.0993
2  E      0.091
3  D    0.00949
4  A   0.000995
5  B 0.00000993
  • 编辑 *

你可以用你的例子来试试。注意我使用了一个data.frame。矩阵不适合此解决方案的结构。

output$example <- DT::renderDataTable({
  xy <- data.frame(letter = LETTERS[1:5], value = c("9.95e-04","9.93e-06","9.93e-02","9.49e-03","9.10e-02"))
  xy$num_val <- as.numeric(as.character(xy$value))
  xy[order(xy$num_val, decreasing = TRUE), c("letter", "value")]
}
pieyvz9o

pieyvz9o2#

您可以在JavaScript中进行格式化:

library(DT)

df <- data.frame(
  V1 = LETTERS[1:5],
  V2 = c(9.95e-04, 9.93e-06, 9.93e-02, 9.49e-03, 9.10e-02)
)

js <- c(
  "function(row, data, displayNum, index){",
  "  var x = data[1];",
  "  $('td:eq(1)', row).html(x.toExponential(2));",
  "}"
)

datatable(
  df, rownames = FALSE, 
  options = list(
    rowCallback = JS(js)
  )
)

q3qa4bjr

q3qa4bjr3#

对于仍在努力解决这个问题的人,您可以使用as.numeric()和formatC的组合来格式化数据。

# Example data frame
table_data <- data.frame(
  pvalue = c(0.0000000000000002320234057340785, 0.00000000000000345, 0.0320320320),
  padj = c(0.000000005670234057340785, 0.000000000000000456, 0.0520320320)
)

print(table_data)
#>         pvalue         padj
#> 1 2.320234e-16 5.670234e-09
#> 2 3.450000e-15 4.560000e-16
#> 3 3.203203e-02 5.203203e-02

# Convert pvalue and padj columns to scientific notation and back to number
table_data$pvalue <- as.numeric(formatC(table_data$pvalue, format = "e", digits = 2))
table_data$padj <- as.numeric(formatC(table_data$padj, format = "e", digits = 2))

print(table_data)
#>     pvalue     padj
#> 1 2.32e-16 5.67e-09
#> 2 3.45e-15 4.56e-16
#> 3 3.20e-02 5.20e-02

创建于2023-09-15带有reprex v2.0.2

相关问题