我对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索引。