【问题标题】:Data table cap and floor assigning new variables数据表上限和下限分配新变量
【发布时间】:2021-05-27 18:59:23
【问题描述】:

我有一个变量列表,我想设置上限和下限,但我想用不同的名称保存它们,以免覆盖变量。 产生错误的 mtcars 示例:

# Variables to cap and floor
mtcars_vars <- c("wt","qsec","mpg")

# Function to cap and floor 
cap_floor <- function(x,pct_floor = 0.05, pct_cap = 0.95){
  quantiles <- quantile( x, c( pct_floor, pct_cap ),na.rm = TRUE)
  x[ x < quantiles[1] ] <- quantiles[1]
  x[ x > quantiles[2] ] <- quantiles[2]
  x
}

mtcars[,paste0(mtcars_vars,"_cap_fl") := lapply(mtcars_vars, cap_floor)]

这会在 (1 - h) * qs[i] : non-numeric argument to binary operator 中产生一个错误,尽管该函数似乎适用于各个列。

cap_floor(mtcars$qsec)
cap_floor(mtcars$wt)
cap_floor(mtcars$mpg)

知道为什么会这样吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您本质上是lapply()'ing 一个字符向量。你可以使用.SDcols:

    library(data.table)
    setDT(mtcars)
    DTmtcars <- data.table(mtcars)
    DTmtcars[,paste0(mtcars_vars,"_cap_fl") := lapply(.SD, cap_floor), .SDcols = mtcars_vars]
    
    > head(DTmtcars)
        mpg cyl disp  hp drat    wt  qsec vs am gear carb wt_cap_fl qsec_cap_fl mpg_cap_fl
    1: 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4     2.620     16.4600       21.0
    2: 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4     2.875     17.0200       21.0
    3: 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1     2.320     18.6100       22.8
    4: 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1     3.215     19.4400       21.4
    5: 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2     3.440     17.0200       18.7
    6: 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1     3.460     20.1045       18.1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多