R语言 如何像在shiny input中那样通过列名以编程方式更改data.table中的列?

cetgtptt  于 2023-03-05  发布在  其他
关注(0)|答案(3)|浏览(128)

我怎样才能在下面的代码中达到预期的结果?

library(magrittr); library(ggplot2); library(data.table)
dt <- diamonds %>%  setDT  

input <- list()
input$col = "cut"

dt[ , (input$col) :=  ifelse( get(input$col) == "Good", "Bon", get(input$col))] # Original post had typo : ... get(input$col):= "Good" ... instead of ... == ...

以便用户可以输入(例如,通过闪亮的应用程序),在哪些列中需要进行单词替换?
上面的代码生成此错误:

Error in `:=`(get(input$col), "Good") : 
  Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").
fsi0uk1n

fsi0uk1n1#

如果将第二个:=更改为==,则原始代码将正常工作,如下所示:

dt[ , (input$col):=ifelse( get(input$col)=="Good", "Bon", get(input$col))]

但是,一般情况下,您可能需要考虑改用[["col"]]

dt[ , (input[["col"]]):=ifelse( get(input[["col"]])== "Good", "Bon", get(input[["col"]]))]

最后,您还可以使用set(),因为您要就地更新cut

set(dt, j=input$col, value=ifelse(dt[[input$col]]=="Good", "Bon", dt[[input$col]]))

并不是在所有情况下cut都是一个因子,而且实际上是一个数值,因此您在这里替换的方式将导致cut的其他值恢复为它们的基本数值格式。

levels(dt[[input$col]])[levels(dt[[input$col]])=="Good"] <- "Bon"
cfh9epnr

cfh9epnr2#

看起来下面的代码是最短的(写起来)和最快的(执行起来):

dt [ get (input$col) == "Good", (input$col) := "Bon"]

我想知道为什么我没有早点想到这一点?(还有其他人?)...
输出:

> dt
       carat       cut color clarity depth table price    x    y    z
    1:  0.23     Ideal     E     SI2  61.5    55   326 3.95 3.98 2.43
    2:  0.21   Premium     E     SI1  59.8    61   326 3.89 3.84 2.31
    3:  0.23       Bon     E     VS1  56.9    65   327 4.05 4.07 2.31
    4:  0.29   Premium     I     VS2  62.4    58   334 4.20 4.23 2.63
    5:  0.31       Bon     J     SI2  63.3    58   335 4.34 4.35 2.75
   ---                                                               
53936:  0.72     Ideal     D     SI1  60.8    57  2757 5.75 5.76 3.50
53937:  0.72       Bon     D     SI1  63.1    55  2757 5.69 5.75 3.61
53938:  0.70 Very Good     D     SI1  62.8    60  2757 5.66 5.68 3.56
53939:  0.86   Premium     H     SI2  61.0    58  2757 6.15 6.12 3.74
53940:  0.75     Ideal     D     SI2  62.2    55  2757 5.83 5.87 3.64
u5rb5r59

u5rb5r593#

我们可以使用.SDcols

library(data.table)
v1 <- input$col
dt[, (v1) := fcase(.SD[[1]] != "Good", .SD[[1]], default = "Bon"), 
        .SDcols = v1]

相关问题