r-如何使用隐藏列对DataTable进行排序



我对R相当陌生,我正在尝试使用DT包准备一个交互式数据表。我的数据包含数值,但其中一些值前面有<或>符号。我希望我的数据表允许对数值进行交互式排序,无论是否存在<或>在其前面签名。例如>10,<5、9、>8应该排序为<5,>8,9,>10。

我最初的方法是复制包含<和>符号,以删除<和>对此重复列进行符号,并将此数据转换为数值以获得仅包含数值的列。然后,我希望能够根据这些数值对表中的数据进行排序,但我希望在用<和>符号。因此,我想隐藏只包含数值的列(因为我不希望该列出现在表中(,但我想以某种方式将原始列的排序函数链接到该隐藏列。

以下是一些示例数据和脚本,其中我已经复制了列(b到c(,删除了<和>符号,并将其转换为数值以获得列c,然后我将其隐藏:

library(DT)
df <- data.frame(a=1:5, b=c('10','5.0','2.0','< 1.0','> 20'), c=c(10,5,2,1,20))
DT <- DT::datatable(df, 
options = list(columnDefs = 
list(list(visible=FALSE, 
targets=3))))
DT

我一直无法找到一种方法,通过使用b列的排序按钮来对隐藏的c列上的表中的数据进行排序。

我发现这在JavaScript:jQueryDataTables中应该是可能的——按隐藏列排序日期然而,我不知道如何在R中做到这一点,无论是在R中使用合适的函数,还是使用JS((函数在JavaScript中提供它。

有人能帮我解决这个问题吗?

以下是使用render:的解决方案

library(DT)
render <- c(
"function(data, type, row){",
"  if(type === 'sort'){",
"    return parseFloat(data.match(/\d+\.?\d+/)[0]);",
"  }else{",
"    return data;",
"  }",
"}"
)
df <- data.frame(
a = 1:5, 
b = c('10','5.0','2.0','< 1.0','> 20')
)
DT <- datatable(df, 
options = list(
columnDefs = list(
list(render = JS(render), type = "num", targets = 2)
)
)
)
DT

此解决方案不需要隐藏列。

这里有一种方法。要获得"排序键",请使用order

library(DT)
# df <- data.frame(a=1:5, b=c('10','5.0','2.0','< 1.0','> 20'), c=c(10,5,2,1,20))
df <- data.frame(a = 1:5, b = c('10', '5.0', '2.0', '< 1.0', '> 20'))
df
#ONE APPROACH
df$c <-
stringr::str_replace(string = df$b,
pattern = "[<>]",
replacement = "") %>%
as.numeric()
#ANOTHER APPROACH
df$c <- gsub("[<>]", "", df$b) %>% as.numeric()
DT::datatable(df[order(df$c), -3], rownames = FALSE)
library(DT)
df <- data.frame(a=1:5, b=c('10','5.0','2.0','< 1.0','> 20'), c=c(10,5,2,1,20))
DT <- DT::datatable(df, 
options = list(columnDefs = 
list(list(visible=FALSE, targets=3),
list(orderData=3, targets=2)
)))
DT

注意:这个答案是基于这里的这个答案,但DT现在使用R索引而不是JS索引。

最新更新